using System;
using System.Collections.Generic;
class GfG {
public static List<int> prefixSum2D(int[,] arr, int[,] queries) {
// number of rows
int n = arr.GetLength(0);
// number of columns
int m = arr.GetLength(1);
// Construct prefix sum matrix using 0-based indexing
int[,] prefix = new int[n, m];
for (int i = 0; i < n; ++i) {
for (int j = 0; j < m; ++j) {
prefix[i, j] = arr[i, j];
if (i > 0)
prefix[i, j] += prefix[i - 1, j];
if (j > 0)
prefix[i, j] += prefix[i, j - 1];
if (i > 0 && j > 0)
prefix[i, j] -= prefix[i - 1, j - 1];
}
}
List<int> result = new List<int>();
int q = queries.GetLength(0);
for (int k = 0; k < q; k++) {
int r1 = queries[k, 0];
int c1 = queries[k, 1];
int r2 = queries[k, 2];
int c2 = queries[k, 3];
int total = prefix[r2, c2];
int top = (r1 > 0) ? prefix[r1 - 1, c2] : 0;
int left = (c1 > 0) ? prefix[r2, c1 - 1] : 0;
int overlap = (r1 > 0 && c1 > 0) ? prefix[r1 - 1, c1 - 1] : 0;
int sum = total - top - left + overlap;
result.Add(sum);
}
return result;
}
public static void Main() {
int[,] arr = {
{1, 2, 3, 4},
{5, 6, 7, 8},
{9, 10, 11, 12},
{13, 14, 15, 16}
};
int[,] queries = {
{1, 1, 2, 2}
};
List<int> result = prefixSum2D(arr, queries);
foreach (int sum in result) {
Console.Write(sum + " ");
}
Console.WriteLine();
}
}