问题陈述
给定一个整数序列 a0,a1,...,aN−1。
你需要执行 Q 个查询,每个查询可以是以下之一:
ADD QUERY(t=0 l r x)
:对于每个介于 l 和 r 之间(包括)的 i,将 ai 替换为 ai+x。
DIV QUERY(t=1 l r x)
:对于每个介于 l 和 r 之间(包括)的 i,将 ai 替换为 rmfloor(ai/x),其中 rmfloor(y) 是不大于 y 的最大整数。
MAX QUERY(t=2 l r x=0)
:打印 rmmax(al,al+1,...,ar)。
RESTORE QUERY(t=3 l r x=0)
:对于每个介于 l 和 r 之间(包括)的 i,将 ai 设置为初始值,即输入中给出的值。
约束条件
- 所有输入值都是整数。
- 1leqN,Qleq200,000
- 0leqaileq108
- ti=0,1,2,3
- 0leqlileqrileqN−1
- 1leqxileq1000(当 tineq2,3)
输入
输入以以下格式从标准输入给出:
N Q
a0 a1 ... aN−1
t1 l1 r1 x1
t2 l2 r2 x2
:
tQ lQ rQ xQ
输出
对于每个 MAX QUERY
,打印 rmmax(al,al+1,...,ar),每行一个。
示例输入 1
5 9
1 2 3 4 5
2 0 4 0
0 0 1 10
2 0 4 0
2 2 2 0
1 0 1 4
2 0 0 0
2 1 1 0
3 0 4 0
2 0 1 0
示例输出 1
5
12
3
2
3
2
- rmmax(1,2,3,4,5)=5
- 1,2,3,4,5→11,12,3,4,5
- rmmax(11,12,3,4,5)=12
- rmmax(3)=3
- 11,12,3,4,5→2,3,3,4,5
- rmmax(2)=2
- rmmax(3)=3
- 数组恢复为 1,2,3,4,5
- rmmax(1,2)=2
示例输入 2
4 7
0 1 0 1
2 0 3 0
0 0 3 1
1 0 3 2
2 0 3 0
0 0 3 1
1 0 3 2
2 0 3 0
示例输出 2
1
1
1
示例输入 3
10 23
13 1 22 8 28 18 23 9 22 27
1 3 4 5
1 8 8 8
0 3 9 5
0 2 6 3
3 0 4 0
1 1 3 7
2 2 2 0
2 3 5 0
0 1 4 2
3 0 9 0
2 0 1 0
0 3 9 8
2 1 9 0
0 8 9 5
1 5 7 7
0 3 5 7
0 7 9 7
3 3 6 0
2 1 6 0
0 1 1 7
1 4 8 10
2 0 9 0
1 5 6 1
示例输出 3
3
28
13
36
28
47