单调队列裸题。
维护一个单调队列,队列头元素大,尾元素小,存储数值和坐标,修改时用O(1)的时间插入,询问时用O(log)的时间二分查找在区间内的最大点。
PS:刷水题有益于健康。
/**************************************************************
Problem: 1012
User: zhouyuyang
Language: Pascal
Result: Accepted
Time:832 ms
Memory:1972 kb
****************************************************************/
uses math;
var
a,b:array [0..200005] of longint;
n,modd,last,len,i,x,top,l,r,m:longint;
ch:char;
begin
readln(n,modd);
last:=0;
len:=0;
for i:=1 to n do begin
read(ch); readln(x);
if (ch='A') then begin
inc(len); x:=(x+last) mod modd;
while (a[top]<=x) and (top>0) do dec(top);
inc(top); a[top]:=x; b[top]:=len;
end
else begin
l:=1; r:=top;
while (l<r) do begin
m:=(l+r) div 2;
if (b[m]<len-x+1) then l:=m+1 else r:=m;
end;
writeln(a[l]); last:=a[l];
end;
end;
end.