回答する際の、配列のインデックス指定で混乱した。変数名にもうちょい工夫が必要だったな。
var input = Console.ReadLine()! .Split(' ') .Select(x => int.Parse(x)) .ToList(); var H = input[0]; var W = input[1]; var X = new int[H, W]; for (var i = 0; i < H; i++) { input = Console.ReadLine()! .Split(' ') .Select(x => int.Parse(x)) .ToList(); for (var j = 0; j < W; j++) { X[i, j] = input[j]; } } // 横平方向の累積和を計算 var Z = new int[H + 1, W + 1]; for (var i = 1; i <= H; i++) { for (var j = 1; j <= W; j++) { Z[i, j] = Z[i, j - 1] + X[i - 1, j - 1]; } } // 縦方向の累積和を計算 for (var j = 1; j <= W; j++) { for (var i = 1; i <= H; i++) { Z[i, j] = Z[i - 1, j] + Z[i, j]; } } // 問題を読み込む var Q = int.Parse(Console.ReadLine()!); var A = new int[Q]; var B = new int[Q]; var C = new int[Q]; var D = new int[Q]; for (var i = 0; i < Q; i++) { input = Console.ReadLine()! .Split(' ') .Select(x => int.Parse(x)) .ToList(); A[i] = input[0]; B[i] = input[1]; C[i] = input[2]; D[i] = input[3]; } // 答えを求める for (var i = 0; i < Q; i++) { var answer = Z[C[i], D[i]] + Z[A[i] - 1, B[i] - 1] - Z[A[i] - 1, D[i]] - Z[C[i], B[i] - 1]; Console.WriteLine(answer); }