Data Structure
时间限制:C/C++/Rust/Pascal 1秒,其他语言2秒
空间限制:C/C++/Rust/Pascal 32 M,其他语言64 M
64bit IO Format: %lld

题目描述

将一个非负整数序列划分为段,分别计算出各段中的整数按位或的结果,然后再把这些结果按位与起来得到一个最终结果,把这个最终结果定义为这个序列的一个值。
比如序列为 ,如果划分为,那么值为。当然划分可能不止一种,所以也可能不止一个。
给定一个长度为的非负整数序列,一个整数和以下三种操作:
    1.给定一个整数,把序列中的所有数字按位或上。即
    2.给定一个整数,把序列中的所有数字按位与上。即
    3.查询当前序列最大的值。
lililalala太菜了,他希望你来帮他解决这个问题。

输入描述:

第一行两个整数--序列长度和划分的段数。
第二行个整数
第三行一个整数--操作的数量。
然后行其中第行为以下三种格式之一:
--把序列中的所有数字按位或上
--把序列中的所有数字按位与上
--查询当前序列最大的值。

输出描述:

对于每次查询(操作)输出一行一个整数作为查询结果。
示例1

输入

复制
3 2
11 30 4
5
3
1 9
3
2 22
3

输出

复制
10
13
4

说明

第一次查询序列为\ [11,30,4],划分为\ [11],[30,4]时有最大值\ 10
第二次查询序列为\ [11,31,13],划分为\ [11,31],[13]时有最大值\ 13
第三次查询序列为\ [2,22,4],划分为\ [2,22],[4]时有最大值\ 4