Description 题目描述
给定一列正整数 a 1 , a 2 , … , a n a_1,a_2,… ,a_n a1,a2,…,an,每一个数都在 0 0 0至 p − 1 p-1 p−1之间。可以对这列数进行两种操作:
添加操作:向序列后添加一个数,序列长度变成 n + 1 n+1 n+1。
询问操作:询问这个序列中最后 L L L个数中最大的数是多少.
程序运行的最开始,整个序列为空。写一个程序,读入操作的序列,并输出询问操作的答案.
Input 输入
输入文件的第一行有两个正整数 m ( 1 ≤ m ≤ 2 ∗ 1 0 5 ) m(1≤m≤2*10^5) m(1≤m≤2∗105)和 p ( 1 ≤ p ≤ 2 ∗ 1 0 9 ) p(1≤p≤2*10^9) p(1≤p≤2∗109)。
接下来的 m m m行,每行表示一个操作。
如果该行的内容是 Q Q Q L L L,则表示这个操作是询问序列中最后 L L L个数的最大数是多少;
如果是 A A A t ( 0 ≤ t ≤ p ) t(0≤t≤p) t(0≤t≤p),则表示向序列后面加一个数,加入的数是: ( t + a ) (t+a) (t+a)除以 p p p的余数。
其中, t t t是输入的参数, a a a是在这个添加操作之前最后一个询问操作的答案(如果之前没有询问操作,则 a = 0 a=0 a=0)。
第一个操作—定是添加操作。对于询问操作, L > 0 L>0 L>0且不超过当前序列的长度。
Output 输出
对于每一个询问操作,输出一行。该行只有一个数,即序列中最后 L L L个数的最大数
Sample Input 样例输入
10 100
A 97
Q 1
Q 1
A 17
Q 2
A 63
Q 1
Q 1
Q 3
A 99
Sample Output 样例输出
97
97
97
60
60
97
很明显,这道题是裸线段树,先建一棵空树,开一个计数器记下已经进入的个数,两个操作就可以抽象为:
(1)加入操作(eg:加入
R
R
R) 改一下
n
u
m
num
num位置的值为
(
R
+
l
a
s
t
)
%
p
(R+last)\%p
(R+last)%p
(2)查询操作(eg:查最后
R
R
R个) 查一下
[
n
u
m
−
R
+
1
,
n
u
m
)
[num-R+1,num)
[num−R+1,num)的最大值即可
其实是水题,并没有怎么卡(想要卡的?看看2015山东省选第二轮D1 音质检测…)
上代码…
Code
线段树真是好东西…