请实现一个数据结构支持以下操作:
区间循环左右移,区间与,区间或,区间求和。
第一行n,q表示数列长度及操作次数。
第二行n个数表示初始序列。
接下来q行表示操作。
操作格式如下:
一行表示一个操作。所有操作形如 opt l r v。
opt=1 表示将区间[l,r]循环右移v位。
opt=2 表示将区间[l,r]循环左移v位。
opt=3 表示将区间[l,r]按位或上v。
opt=4 表示将区间[l,r]按位与上v。
opt=5 询问区间[l,r]的和。
保证opt=1或2时 1 ≤ v ≤ 20
注意:为了优化你的做题体验,操作5也会输入一个v,但是是没有意义的。
注意:循环左右移在20个二进制位的意义下进行
对于每个opt=5的操作,输出一个数表示答案。
10 10 10112 23536 1305 7072 12730 29518 12315 3459 12435 29055 4 5 10 12373 2 1 6 7 5 4 10 24895 1 1 4 8 5 3 7 7767 5 7 9 6127 4 2 8 30971 5 4 10 2663 1 7 10 1 1 2 9 5
2001530 1600111 24611 49482
1 ≤ N,Q ≤ 2*105 0 ≤ ai < 220一些说明:1. 对于00000000000000000101,右移一位后会变成100000000000000000102. 不是区间位移,是区间中的每一个数的二进制位的位移