【问题描述】
考虑将Fenwick Tree 扩展到 $k$ 进制意义下,C++代码如下:
void add(int x, int y) {
while (x <= n) {
s[x] ^= y;
x += lowbit(x);
}
}
int sum(int x) {
int res = 0;
while (x > 0) {
res ^= s[x];
x -= lowbit(x);
}
return res;
}
其中,$\texttt{lowbit(x)}$ 的定义为 $x$ 在 $k$ 进制下最低非 0 位的值。比如 $k=5,\texttt{lowbit}(120)=20$。
但是上述代码并不能正确地维护前缀异或和,甚至会出现TLE。不过并不会出现死循环,现请你快速维护上面的两个函数。
【输入格式】
从文件d.in中读入数据。
输入数据第一行包含三个正整数 $n,q,k$ ,分别表示序列长度,操作次数和进制。
接下来 $q$ 行每行描述一个操作,具体如下:
$1\space x\space y$ ,表示执行 $\texttt{add}(x,y)$ 。
$2\space x\space y$ ,表示输出 $\texttt{sum}(x)$ 。
【输出格式】
输出到文件d.out中。
对于每个 2 操作,输出一行表示询问的结果。
【样例输入输出】
Input | Output |
---|---|
10 10 3 1 4 10 2 7 1 2 5 2 10 2 6 1 3 7 1 7 3 2 8 2 9 2 10 |
10 15 0 11 0 12 |
样例2,3 请见下发文件。
【数据范围】
对于所有数据,有 :
$1 \leq x \leq n \leq 10^9, 1 \leq q,k \leq 2 \times 10^5,0 \leq y \leq 10^9$
子任务编号 | $n\leq$ | $q\leq$ | $k$ | 分值 |
---|---|---|---|---|
1 | $3000$ | $3000$ | 无 | 10 |
2 | $2 \times 10^5$ | $2 \times 10^5$ | $=2$ | 10 |
3 | $2 \times 10^5$ | $2 \times 10^5$ | 无 | 10 |
4 | $2 \times 10^5$ | $2 \times 10^5$ | 是奇数 | 10 |
5 | $10^9$ | $2 \times 10^5$ | 是奇数 | 10 |
6 | $10^9$ | $2 \times 10^5$ | 是奇数 | 10 |
7 | $10^9$ | $2 \times 10^5$ | $=2$ | 10 |
8 | $10^9$ | $2 \times 10^5$ | 无 | 10 |
9 | $10^9$ | $2 \times 10^5$ | 无 | 10 |
10 | $10^9$ | $2 \times 10^5$ | 无 | 10 |