配列のインデックスが配列に格納されているような形なんで、ミスしてもなかなか気付かずハマった。配列の中身を出力するコードを一時的に足して、間違っていた箇所にようやく気付けた。
var HWN = Console.ReadLine()!.Split(' ').Select(x => int.Parse(x)).ToList(); var (H, W, N) = (HWN[0], HWN[1], HWN[2]); var (A, B, C, D) = (new int[N], new int[N], new int[N], new int[N]); for (var i = 0; i < N; i++) { var ABCD = Console.ReadLine()!.Split(' ').Select(x => int.Parse(x)).ToList(); (A[i], B[i], C[i], D[i]) = (ABCD[0], ABCD[1], ABCD[2], ABCD[3]); } // N 日目の積雪をマッピング var X = new int[H + 2, W + 2]; for (var i = 0; i < N; i++) { X[A[i], B[i]]++; X[A[i], D[i] + 1]--; X[C[i] + 1, B[i]]--; X[C[i] + 1, D[i] + 1]++; } // 2次元累積和を計算 var Z = new int[H + 2, W + 2]; for (var h = 1; h <= H; h++) { for (var w = 1; w <= W; w++) { Z[h, w] = Z[h, w - 1] + X[h, w]; } } for (var w = 1; w <= W; w++) { for (var h = 1; h <= H; h++) { Z[h, w] = Z[h - 1, w] + Z[h, w]; } } // 答えを出力 for (var h = 1; h <= H; h++) { for (var w = 1; w <= W; w++) { if (w > 1) { Console.Write(" "); } Console.Write(Z[h, w]); } Console.WriteLine(); }