Cidoai的植物
时间限制:C/C++/Rust/Pascal 1秒,其他语言2秒
空间限制:C/C++/Rust/Pascal 256 M,其他语言512 M
64bit IO Format: %lld

题目描述

Cidoai 喜欢植物。
Cidoai 有一个 nm 列的花园,这个花园初始没有植物,它会对这个花园做 k 次如下操作之一:
1. 选择第 i 列,在这一列上没有植物的位置上全部种下植物 x
2. 选择第 a 行第 b 列,如果这个位置有植物,则铲除这株植物,否则不进行操作。
现在它给了你 n,m 以及它的操作序列,它想知道操作完后花园的状态。
由于输入量过大,操作数列不会被直接输入,而是由参数生成,如下:
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
其中 seed 由输入给定。op[t] 表示第 t 次操作对应的操作编号,为 1 或 2。若第 t 次操作为 1 操作,i[t],x[t] 表示对应的列数和植物编号。若第 t 次操作为 2 操作,a[t],b[t] 表示对应的行数和列数。
rnd 函数的 C++ 代码如下:
unsigned seed;
unsigned rnd(){
	unsigned ret=seed;
	seed^=seed<<13;
	seed^=seed>>17;
	seed^=seed<<5;
	return ret;
}
由于输出量过大,你不需要输出整个花园的状态,只需要输出如下值即可:\bigoplus \limits_{i=1}^{n}\bigoplus \limits_{j=1}^{m} p_{i,j} \times ((i-1)\times m+j)。其中 p_{i,j} 表示花园中第 i 行第 j 列的植物编号,若该位置没有植物,则编号为 0。这个式子表示枚举所有 i=1,2,\cdots,n,j=1,2,\cdots,m,求得所有 p_{i,j} \times ((i-1)\times m+j) 值后将其异或起来。

输入描述:

一行四个整数 n,m,k,seed

1 \le n \le 2 \times 10^4,1 \le m \le 200,1 \le k \le 5\times 10^6,0 \le seed < 2^{32},操作 1 满足 1 \le i \le m, 1 \leq x \leq nm,操作 2 满足 1 \le a \le n,1 \le b \le m

输出描述:

一行一个整数,表示答案。

注意输入和输出的行列顺序
示例1

输入

复制
2 3 6 10

输出

复制
16

说明

由参数生成的操作数列如下:
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

输入

复制
3 5 100 384312

输出

复制
167

说明

花园的最后状态如下:
4 9 12 3 8
4 3 12 6 0
4 7 5 6 9
示例3

输入

复制
20000 200 4000000 1314520

输出

复制
1569159159130
示例4

输入

复制
20000 200 4990000 1206502205

输出

复制
10019837969254

备注:

在 C++ 中,unsigned int 的运算会自动对 2^{32} 取模。