I. We need more and more OR numbers

传统 3000 ms 1024 MiB
标准 IO
文本比较

题目描述

给定一个长度为 nn 的序列 aa,序列中的数字都是正整数,你需要完成一段代码,完成以下两种操作:
1 l r:将序列中所有下标范围为 [l,r](1lrn)[l,r](1\le l \le r\le n) 的数字变成它的或数。
2 pos:询问当前下标为 pospos 的数字是多少。

一个数字的或数是指将一个正整数的的十进制的表示形式每个数位按位或操作之后的结果,例如,数字 251025_{10} 的或数就是 7107_{10},因为 210 OR 510=7102_{10}\ OR\ 5_{10}=7_{10}

举个例子,令 fOR(x)fOR(x) 代表 xx 的或数,那么 fOR(11)=1,fOR(45)=5,fOR(14)=5,fOR(520)=7fOR(11)=1,fOR(45)=5,fOR(14)=5,fOR(520)=7

按位或运算是一种位运算操作,通常用于处理二进制数据。它将两个二进制数的对应位进行比较,如果其中一个位上的数是1或者两个位上的数都是1,那么结果位就被设置为1。只有当两个位都是0的时候,结果位才会是0。
按位或运算通常用符号 OROR 表示(在编程语言中通常用 '|' 表示),它的规则如下:

  • 0 OR 0 = 0
  • 0 OR 1 = 1
  • 1 OR 0 = 1
  • 1 OR 1 = 1

举个例子,假设有两个正整数数:A=210=0102A = 2_{10} = 010_{2}B=510=1012B = 5_{10} = 101_{2}。进行按位或运算后,得到的结果是: A OR B=710=1112A\ OR\ B = 7_{10} = 111_{2}
这意味着,每一位上的 11 都是由 AABB 中相应位上的 11 通过按位或操作得到的。

输入格式

第一行,一个整数 t(1t105)t(1\le t \le 10^5),代表数据组数。

对于每组数据:
第一行,一个整数 n(1n5105)n(1\le n \le 5·10^5),代表序列中数字的数量。
第二行,nn 个整数 a(1a109)a(1\le a \le 10^9),代表这个序列。
第三行,一个整数 q(1q5105)q(1\le q \le 5·10^5),代表操作次数。
接下来的 qq 行,每行为一个题目中给出的操作。

保证在同一测试点内的 n106;q106\sum n \le 10^6;\sum q \le 10^6

输出格式

对于每个第 22 种询问,输出一行整数表示答案。

样例

输入样例

2
6
11 45 14 520 1314 12345678
11
1 1 3
2 4 
2 2
1 3 6
2 6
2 2
2 1
1 4 4
2 3
2 4
2 5
3
2 4 6
4
1 1 3
2 1
2 2
2 3

输出样例

520
5
15
5
1
5
7
7
2
4
6

提示
在样例第 11 组数据中,第 11 次操作后,序列变为 [1,5,5,520,1314,12345678][1,5,5,520,1314,12345678]