#12. 子矩阵的和

子矩阵的和

输入一个 nnmm 列的整数矩阵,再输入 qq 个询问,每个询问包含四个整数 x1,y1,x2,y2x_1, y_1, x_2, y_2,表示一个子矩阵的左上角坐标和右下角坐标。

对于每个询问输出子矩阵中所有数的和。

输入格式

第一行包含三个整数 nmqn,m,q

接下来 nn 行,每行包含 mm 个整数,表示整数矩阵。

接下来 qq 行,每行包含四个整数 x1,y1,x2,y2x_1, y_1, x_2, y_2,表示一组询问。

输出格式

qq 行,每行输出一个询问的结果。

数据范围

1n,m10001 \le n,m \le 1000,
1q2000001 \le q \le 200000,
1x1x2n1 \le x_1 \le x_2 \le n,
1y1y2m1 \le y_1 \le y_2 \le m,
1000矩阵内元素的值1000-1000 \le 矩阵内元素的值 \le 1000

输入样例:

3 4 3
1 7 2 4
3 6 2 8
2 1 2 3
1 1 2 2
2 1 3 4
1 3 3 4

输出样例:

17
27
21

数据 1(样例结构+额外查询):基础正确性;卡公式写错、漏加/漏减项、输出行数不对。

数据 2(1×1 且为负):卡最小边界与负数处理;也卡数组越界(x1-1/y1-1)。

数据 3(1×m 单行):卡把二维前缀和写错(特别是行/列维度混用),以及退化成一维时的边界错误。

数据 4(n×1 单列):同上,卡单列退化、边界与索引错误。

数据 5(全 0):卡“前缀数组未初始化/累加写错”导致输出出现非 0。

数据 6(专门的边界查询):卡 x1=1 或 y1=1 时的处理(很多人忘了补 0 边界),以及 off-by-one。

数据 7(30×40 随机 + 5000 查询):综合覆盖,卡零散实现 bug(坐标读错、公式项顺序错等)。

数据 8(1000×1000 全 1,q=200000 压测):强力卡复杂度:

暴力每次遍历子矩阵会 TLE

I/O 慢、没用快速读写也容易卡(q 很大)

数据 9(1000×1000 棋盘 ±1000):卡大规模正负抵消、边界与正确性;也能卡“用 32 位 int 存前缀和/答案”在某些实现里溢出风险(建议用 64 位)。