智乃想考一道平衡树
时间限制:C/C++/Rust/Pascal 1秒,其他语言2秒
空间限制:C/C++/Rust/Pascal 1024 M,其他语言2048 M
64bit IO Format: %lld

题目描述

众所周知,某些数据结构可以实现数组的子区间位置翻转功能,智乃现在有以下几种区间操作,她想让你编写一种数据结构实现这几个功能。

1、数组子区间位置翻转,即对于一个数组区间[l,r],反转后变为a_{r},a_{r-1},...,a_{l+1},a_{l}

2、子区间内所有元素加上b,即\forall i\in[l,r],a_i:=a_i+b

3、子区间内所有元素乘以c,即\forall i\in[l,r],a_i:=a_i\cdot c

4、求区间元素之和对10^{7}+19取余数的结果。

对于一个长度为N的数组所有长度为M的子区间,有且仅有N-M+1个子区间,分别为[0,M-1],[1,M],...,[N-M,N-1],我们按照顺序称其为第i个长M子区间,第i个长M子区间的左端点为l_{i},右端点为r_{i}

智乃现在对这N-M+1个子区间非常感兴趣,所以她决定依次对这些数组区间进行操作,具体来讲,她将会进行N-M+1次数组操作,且第i次操作的子区间左端点为上文中提到的l_{i},右端点为上文中的r_{i}

输入描述:

第一行输入两个正整数N,M(1\leq M \leq N \leq 10^{7})表示数组区间的大小,子区间的长度。

由于数据量较大,故采取前K个数据从外部输入,后N-K个数据按照某种方式生成。

接下来输入一个正整数K(1\leq K \leq min(N,10^5))表示a数组的前K个数据。

接下来一行输入K个整数a_i(1\leq a_i \leq 10^{9})表示a_i的值。

对于后N-K个未确定的元素,按照a_{i}=a_{i-K}+i(数组a的下标从0开始计算)的方式依次确定它们的值。

接下来还需要确定N-M+1个操作的内容。

由于数据量较大,故采取前Q个操作从外部输入,后N-M+1-Q个操作按前Q个操作循环的模式。

接下来首先输入一个正整数Q(1\leq Q \leq min(N-M+1,10^{5}))

接下来Q行首先输入一个正整数op(1\leq op \leq 4)表示操作。

根据操作数不同,表示不同的含义。

op=1表示需要对第i个子区间执行区间元素翻转的操作

op=2,则还需输入一个整数b(1\leq b \leq 10^{9})表示对第i个子区间执行区间元素加上b的操作。

op=3,则还需输入一个整数c(0\leq c \leq 10^{9})表示对第i个子区间执行区间元素乘以c的操作。

op=4,则需要查询第i个子区间元素之和对10^{7}+19取余数的结果。

输出描述:

为了避免输出量过大,请按照如下方式整合所有查询的答案后仅输出一个整数。

记每一个op_i=4,区间元素之和对10^{7}+19余数的结果为ans_i

请输出ans_0 \oplus ans_1 \oplus ... \oplus ans_{l-1}\oplus ans_l(假设有l次查询操作)。

其中\oplus表示位运算异或
示例1

输入

复制
5 2
5
1 2 3 4 5
4
1
4
3 10
4

输出

复制
41

说明

4个操作

先反转[0,1],变为[2,1,3,4,5]

然后求和[1,2],答案为4

[2,3]每个数乘以10,变为[2,1,30,40,5]

求和[3,4],答案为45

输出4 \oplus 45=41
示例2

输入

复制
1000 1000
5
121439503 385390597 407275895 920845453 338014658
1
4

输出

复制
5926922

备注:

请注意本题为非常见模数10^{7}+19,题目保证它是一个质数。