using
System;
using
System.Collections.Generic;
class
pair {
public
int
first, second;
public
pair(
int
x,
int
y)
{
this
.first = x;
this
.second = y;
}
}
class
GFG {
static
int
n = 4;
static
int
m = 4;
static
int
diagonal_sum(
int
[, ] arr,
List<
int
> right_inclined_digsum,
List<
int
> left_inclined_digsum,
int
n,
int
x,
int
y)
{
int
a = (n - x) + y - 1;
int
b = x + y;
int
sum = right_inclined_digsum[b]
+ left_inclined_digsum[a] - arr[x, y];
return
sum;
}
static
void
precompute(
int
n,
int
m,
int
[, ] arr,
List<
int
> right_inclined_digsum,
List<
int
> left_inclined_digsum)
{
for
(
int
i = 0; i < n; i++) {
for
(
int
j = 0; j < m; j++) {
right_inclined_digsum[i + j] += arr[i, j];
}
}
for
(
int
i = n - 1; i >= 0; i--) {
for
(
int
j = 0; j < m; j++) {
left_inclined_digsum[n - 1 - i + j]
+= arr[i, j];
}
}
}
static
void
solve(
int
[, ] arr,
int
Q, List<pair> query)
{
List<
int
> right_inclined_digsum =
new
List<
int
>();
List<
int
> left_inclined_digsum =
new
List<
int
>();
for
(
int
i = 0; i < n + m - 1; i++) {
right_inclined_digsum.Add(0);
left_inclined_digsum.Add(0);
}
precompute(n, m, arr, right_inclined_digsum,
left_inclined_digsum);
int
it = 0;
while
(Q > 0) {
Q--;
int
x = query[it].first;
int
y = query[it].second;
Console.WriteLine(diagonal_sum(
arr, right_inclined_digsum,
left_inclined_digsum, n, x, y));
it++;
}
}
public
static
void
Main(
string
[] args)
{
int
[, ] arr = { { 1, 2, 2, 1 },
{ 2, 4, 2, 4 },
{ 2, 2, 3, 1 },
{ 2, 4, 2, 4 } };
int
Q = 3;
List<pair> query =
new
List<pair>();
query.Add(
new
pair(0, 0));
query.Add(
new
pair(3, 1));
query.Add(
new
pair(3, 3));
solve(arr, Q, query);
}
}