时间限制:C/C++/Rust/Pascal 1秒,其他语言2秒
空间限制:C/C++/Rust/Pascal 256 M,其他语言512 M
64bit IO Format: %lld
题目描述
Cidoai 喜欢植物。
Cidoai 有一个

行

列的花园,这个花园初始没有植物,它会对这个花园做

次如下操作之一:
1. 选择第

列,在这一列上
没有植物的位置上全部种下植物

;
2. 选择第

行第

列,如果这个位置有植物,则铲除这株植物,否则不进行操作。
现在它给了你

以及它的操作序列,它想知道操作完后花园的状态。
由于输入量过大,操作数列不会被直接输入,而是由参数生成,如下:
def rnd():
p=(1<<32)
ret=seed
seed=(seed xor ((seed<<13) mod p)) mod p
seed=(seed xor ((seed>>17) mod p)) mod p
seed=(seed xor ((seed<<5) mod p)) mod p
return ret
for t=1 to k:
op[t]=(rnd() mod 2) + 1
if op[t]==1:
i[t]=(rnd() mod m) + 1
x[t]=(rnd() mod (n*m)) + 1
if op[t]==2:
a[t]=(rnd() mod n) + 1
b[t]=(rnd() mod m) + 1
其中

由输入给定。
![op[t]](https://www.nowcoder.com/equation?tex=op%5Bt%5D)
表示第

次操作对应的操作编号,为 1 或 2。若第

次操作为 1 操作,
![i[t],x[t]](https://www.nowcoder.com/equation?tex=i%5Bt%5D%2Cx%5Bt%5D)
表示对应的列数和植物编号。若第

次操作为 2 操作,
![a[t],b[t]](https://www.nowcoder.com/equation?tex=a%5Bt%5D%2Cb%5Bt%5D)
表示对应的行数和列数。
rnd 函数的 C++ 代码如下:
unsigned seed;
unsigned rnd(){
unsigned ret=seed;
seed^=seed<<13;
seed^=seed>>17;
seed^=seed<<5;
return ret;
}
由于输出量过大,你不需要输出整个花园的状态,只需要输出如下值即可:
%5Ctimes%20m%2Bj))
。其中

表示花园中第

行第

列的植物编号,若该位置没有植物,则编号为

。这个式子表示枚举所有

,求得所有
%5Ctimes%20m%2Bj))
值后将其异或起来。
输入描述:
一行四个整数
。
输出描述:
一行一个整数,表示答案。
注意输入和输出的行列顺序。
示例1
说明
由参数生成的操作数列如下:
1 1 1
2 1 1
2 2 1
1 2 5
1 3 1
2 2 3
花园的最后状态为:
0 5 1
0 5 0
示例2
说明
花园的最后状态如下:
4 9 12 3 8
4 3 12 6 0
4 7 5 6 9
示例3
输入
复制
20000 200 4000000 1314520
示例4
输入
复制
20000 200 4990000 1206502205
备注:
在 C++ 中,unsigned int 的运算会自动对
取模。