ORMAX
题号:NC225511
时间限制:C/C++/Rust/Pascal 1秒,其他语言2秒
空间限制:C/C++/Rust/Pascal 128 M,其他语言256 M
64bit IO Format: %lld

题目描述

众所周知,今天的题面都很不正经,所以该题是一个正经的题面。

给定一个数组A,长度为n,你需要对该数组进行两种操作:

查询操作:1 l r 存在子区间[X,Y] 使得AX or AX+1 or AX+2  ... AY-2 or AY-1 or AY的值最大,输出这个最大值。

修改操作:2 l r x 将区间[l,r]的数全修改为x。

这里or指或操作。

输入描述:

第一行输入两个正整数n,m表示数组长度(1<=n<=1e6),操作个数(1<=m<=5e5)。

第二行输入n个数表示A[i](1<=A[i]<230)。

接下来m行首先输入一个数op(op==1 || op==2)当op=1时输入两个正整数l,r,否则输入三个正整数l,r,x(1<=l<=r<=n,1<=x<230)。

输出描述:

对于每一个查询操作输出最大值,每个答案占一行

示例1

输入

复制
5 3
1 2 3 4 5
1 3 4
2 2 4 3
1 2 4

输出

复制
7
3