#25. 位运算

位运算

问题描述

对于一个整数,在计算机中是由二进制表示成的,从右往左依次从低位到高位,最右边是第 00 位。

例如 1313,其在计算机中的二进制为 11011101,原理为 1×20+0×21+1×22+1×23=131\times 2^0+0\times 2^1+1\times 2^2+1\times 2^3=13

现在给定 11 个整数 nnmm 次操作,操作具体为:

1 x:输出 nnxx 位的值是 00 还是 11,例如 1313 的第 22 位值是 11

2 l r:将 nnll 位到第 rr 位的值按位取反,然后输出 nn 的值。

3 l r:将 nnll 位到第 rr 位设置为 11,然后输出 nn 的值。

4 l r:将 nnll 位到第 rr 位设置为 00,然后输出 nn 的值。

5:输出该整数二进制中最后一个 11 所代表的值,例如 1101011010 你需要输出 221100011000 你需要输出 88,如果不存在 11 输出 00

对于每次操作,你是否可以做到 O(1)O(1),而并非是 O(logn)O(\log n)?

输入格式

第一行输入两个正整数 n,mn,m。 (1n<230,1m2×1051\le n< 2^{30},1\le m\le 2\times 10^5

接下来 mm 行,输入为其中 11 种:

1 x:输出 nnxx 位的值,例如 1313 的第 22 位值是 11(0x<30)(0\le x< 30)

2 l r:将 nnll 位到第 rr 位的值按位取反,然后输出 nn 的值。(0lr30)(0\le l\le r\le 30)

3 l r:将 nnll 位到第 rr 位设置为 11,然后输出 nn 的值。(0lr30)(0\le l\le r\le 30)

4 l r:将 nnll 位到第 rr 位设置为 00,然后输出 nn 的值。(0lr30)(0\le l\le r\le 30)

5:输出该整数二进制中最后一个 11 所代表的值,例如 1101011010 你需要输出 221100011000 你需要输出 88,如果不存在 11 输出 00

输出格式

对于每次操作,按照题目要求输出。

样例输入1

13 6
1 3
2 1 3
3 1 3
4 1 2
5
2 1 1

样例输出1

1
3
15
9
1
11

样例输入2

37 9
1 3
2 2 3
3 1 4
4 1 3
5
2 1 1
1 4
3 1 4
5

样例输出2

0
41
63
49
1
51
1
63
1

说明

1313 的二进制为 11011101

第一次操作输出 11

第二次操作后二进制变成 00110011,输出 33

第三次操作后二进制变成 11111111,输出 1515

第四次操作后二进制操作变成 10011001,输出 99

第五次操作输出 11

第六次操作后二进制变成 10111011,输出 1111