Optimal: 2D prefix sums
Time O(R·C + q) Space O(R·C)Build an (R+1) × (C+1) table once in O(R·C). Each query is P[r2+1][c2+1] − P[r1][c2+1] − P[r2+1][c1] + P[r1][c1].
class Solution {
public int[] regionSums(int[][] matrix, int[][] queries) {
int R = matrix.length, C = matrix[0].length;
int[][] P = new int[R + 1][C + 1];
for (int r = 0; r < R; r++)
for (int c = 0; c < C; c++)
P[r + 1][c + 1] = matrix[r][c] + P[r][c + 1] + P[r + 1][c] - P[r][c];
int[] out = new int[queries.length];
for (int i = 0; i < queries.length; i++) {
int r1 = queries[i][0], c1 = queries[i][1], r2 = queries[i][2], c2 = queries[i][3];
out[i] = P[r2 + 1][c2 + 1] - P[r1][c2 + 1] - P[r2 + 1][c1] + P[r1][c1];
}
return out;
}
}Verdict: Constant time per query.