luogu#B3693. 数列前缀和 4

数列前缀和 4

题目背景

这次不是数列的问题了。

题目描述

给定一个 nnmm 列的矩阵 aa,有 qq 次询问,每次给定 (u,v)(u, v)(x,y)(x, y),请你求出:

$$(\sum_{i = u}^x \sum_{j = v}^y a_{i,j}) \bmod 2^{64} $$

也就是求出以 (u,v)(u, v) 为左上角、(x,y)(x,y) 为右下角的矩形元素和对 2642^{64} 取余数的结果。

输入格式

本题单测试点内有多组测试数据

输入的第一行是一个整数 TT,表示数据组数。接下来依次给出每组数据的输入信息:

第一行三个整数,依次表示矩阵的行数 nn 和列数 mm 以及询问数 qq
接下来 nn 行,每行 mm 个整数。第 ii 行第 jj 个整数表示 ai,ja_{i,j}
接下来 qq 行,每行四个整数,依次为 u,v,x,yu,v,x, y,表示一组询问。

输出格式

为了避免输出过大,对于每组数据,请输出一行一个整数,表示本组数据的所有询问的答案的按位异或和。

2
3 3 3
1 2 3
4 5 6
7 8 9
1 1 3 3
2 1 2 2
1 2 2 3
2 2 1
1 3
4 6
2 2 2 2
52
6

提示

样例 1 解释

对第一组数据,三次询问的答案依次为 45,9,1645,9,16。其按位异或和为 5252

数据规模与约定

对全部的测试点,保证 1T101 \leq T \leq 101n,m1031 \leq n, m \leq 10^31q1061 \leq q \leq 10^60ai<2640 \leq a_i < 2^{64}1uxn1 \leq u \leq x \leq n1vym1 \leq v \leq y \leq m

数据保证 (n×m)106\sum(n \times m) \leq 10^6q106\sum q \leq 10^6。即输入矩阵的总大小和询问总数均不超过 10610^6

提示

如果你不知道什么是按位异或和,可以在你的代码里添加如下的函数:

template <class T>
T getXorSum(T *begin, T *end) {
  T ret = 0;
  for (T *it = begin; it != end; ++it) ret ^= *it;
  return ret;
}

这一函数的作用是计算传入数组(包括 std::vector)某一左闭右开区间的按位异或和,返回值类型与传入数组的类型相同,调用方法与 std::sort 类似,例如,要求数组 aaa1ana_1 \sim a_n 的按位异或和,则调用 getXorSum(a + 1, a + 1 + n),求 a0an1a_0 \sim a_{n - 1} 的按位异或和,则调用 getXorSum(a, a + n)。如果 aastd::vector,则将上述调用代码里的 a 均改为 a.begin() 即可。