← Home
write a go solution for Description:
You are given an array a of length 2^n. You should process q queries on it. Each query has one of the following 4 types:

1. Replace(x,k) — change a_x to k;
2. Reverse(k) — reverse each subarray [(i-1)*2^k+1,i*2^k] for all i (i>=1);
3. Swap(k) — swap subarrays [(2i-2)*2^k+1,(2i-1)*2^k] and [(2i-1)*2^k+1,2i*2^k] for all i (i>=1);
4. Sum(l,r) — print the sum of the elements of subarray [l,r].

Write a program that can quickly process given queries.

Input Format:
The first line contains two integers n, q (0<=n<=18; 1<=q<=10^5) — the length of array a and the number of queries.

The second line contains 2^n integers a_1,a_2,ldots,a_2^n (0<=a_i<=10^9).

Next q lines contains queries — one per line. Each query has one of 4 types:

- "1 x k" (1<=x<=2^n; 0<=k<=10^9) — Replace(x,k);
- "2 k" (0<=k<=n) — Reverse(k);
- "3 k" (0<=k<n) — Swap(k);
- "4 l r" (1<=l<=r<=2^n) — Sum(l,r).

It is guaranteed that there is at least one Sum query.

Output Format:
Print the answer for each Sum query.

Note:
In the first sample, initially, the array a is equal to 7,4,9,9.

After processing the first query. the array a becomes 7,8,9,9.

After processing the second query, the array a_i becomes 9,9,7,8

Therefore, the answer to the third query is 9+7+8=24.

In the second sample, initially, the array a is equal to 7,0,8,8,7,1,5,2. What happens next is:

1. Sum(3,7) to 8+8+7+1+5=29;
2. Reverse(1) to 0,7,8,8,1,7,2,5;
3. Swap(2) to 1,7,2,5,0,7,8,8;
4. Sum(1,6) to 1+7+2+5+0+7=22;
5. Reverse(3) to 8,8,7,0,5,2,7,1;
6. Replace(5,16) to 8,8,7,0,16,2,7,1;
7. Sum(8,8) to 1;
8. Swap(0) to 8,8,0,7,2,16,1,7.. Output only the code with no comments, explanation, or additional text.