B3665 小清新数据结构题

题目描述

给定 $n$ 条数据,第 $i$ 条数据有 $s_i$ 个数,依次记为 $a_{i, 1}, a_{i, 2}, \dots a_{i, s_i}$。 现在有 $q$ 次询问,每次询问第 $x$ 条数据的第 $y$ 个数,即 $a_{x,y}$ 是多少。 为了避免输出过大,你只需要输出所有询问的答案的**按位异或**和。 按位异或指的是 C++ 中的「^」运算符。你可以参考「说明/提示」中的代码求出若干个数的按位异或和。

输入格式

第一行是两个整数,表示数据条数 $n$ 和询问次数 $q$。 接下来 $n$ 行,每行依次表示一条数据,每行首先是一个整数,表示本条数据的数字个数 $s_i$,接下来 $s_i$ 个整数,依次表示本条数据的每个数字。 接下来 $q$ 行,每行两个整数 $x, y$,表示一次查询。

输出格式

输出一行一个整数表示所有询问的答案的按位异或之和。

说明/提示

### 样例 1 解释 第一次询问的结果为 $5$,第二次询问的结果为 $2$。他们做按位异或的结果为 $7$。 ### 数据规模与约定 对于全部的测试点,保证 $1 \leq n, q, s_i \leq 3 \times 10^6$,$0 \leq a_i \lt 2^{32}$,$1 \leq x \leq n$,$1 \leq y \leq s_x$,且 $\sum\limits_{i = 1}^n s_i \leq 5 \times 10^6$,即 $s_1 + s_2 + \dots + s_n \leq 5 \times 10^6$。 ### 提示 对于使用 C++ 的选手,你可以用如下的函数返回若干个数的按位异或和。 ```cpp #include unsigned int getXorSum(const std::vector& rec) { unsigned ret = 0; for (int i = 0; i < rec.size(); ++i) ret ^= rec[i]; return ret; } // 将需要求按位异或和的数放在 vector 中传参。 ``` 请注意大量数据读入对程序效率造成的影响。