P6466 分散层叠算法(Fractional Cascading)
题目背景
`Fractional Cascading` 算法,国内多译为“分散层叠”。
本题仅提供一个简单而经典的方式给算法验证正确性,原则上会尽量卡掉比较暴力的做法,但不保证乱搞一定无法通过。
题目描述
给出 $k$ 个长度为 $n$ 的**有序数组**。
现在有 $q$ 个查询 : 给出数 $x$,分别求出每个数组中大于等于 $x$ 的最小的数(非严格后继)。
若后继不存在,则定义为 $0$。
每个查询的答案定义为 $k$ 个后继的**异或和**。
你需要**在线地**回答这些询问。
由于输出太多不好,给出参数 $d$,你只需要输出编号为 $d$ 的倍数的询问的答案。询问从 $1$ 开始编号。
输入格式
第一行四个整数 $n,k,q,d$,意义如题面所述。
后 $k$ 行,每行 $n$ 个整数,描述一个数组。**所有数组中出现过的数不重复**,保证每个数组严格递增。
后 $q$ 行,每行一个整数 $x$,描述一个询问。
输入中所得的 $x$ 需要与上一个询问的答案(**无论是否输出**)异或解密,如果这是第一个询问,则无需操作。
输出格式
对于编号为 $d$ 的倍数的每个询问,输出一行一个整数,表示 $k$ 个后继的异或和。
说明/提示
#### 样例解释
对于样例 1,解密后的数据为:
```cpp
6 3 8 1
1 4 6 7 10 20
2 3 8 11 14 18
5 9 12 13 15 17
20
18
15
13
10
8
5
2
```
---
#### 数据规模的与约定
- 对于 $20\%$ 的数据,$k\leq 10$,$n\leq 1000$,$q\leq 1000$。
- 对于 $50\%$ 的数据,$k\leq 10$,$q\leq 2\times 10^5$。
- 对于 $100\%$ 的数据,$1 \leq k\leq 100$,$2\leq n\leq 10^4$,$q\leq 5\times 10^5$,$1\leq d\leq 10$,解密后输入中出现的数均在 $[1,5\times 10^8)$ 范围内。