BZOJ-1012 最大数
做一棵线段树,支持区间查询最大值和单点修改。
先开一个能容纳200000个数的线段树,初始化全部数为0。
查询的时候只需要找max(m-l+1,m),其中m是此时数列的长度。
添加的时候就直接修改第m+1个数,然后m++。
-
var
-
n,d,t,i,a,m:longint;
-
c:char;
-
num:array[1..600005] of longint;
-
-
function max(a,b:longint):longint;
-
begin
-
if a>b then max:=a else max:=b;
-
end;
-
-
procedure add(a:longint);
-
var i:longint;
-
begin
-
inc(m);i:=262144+m;
-
num[i]:=a;
-
while i<>1 do
-
begin
-
i:=i div 2;
-
num[i]:=max(num[2*i],num[2*i+1]);
-
end;
-
end;
-
-
function que(s,e:longint):longint;
-
begin
-
que:=0;
-
inc(s,262144-1);inc(e,262144+1);
-
while e-s<>1 do
-
begin
-
if (s=(s div 2)*2)and(que<num[s+1]) then que:=num[s+1];
-
if (e=(e div 2)*2+1)and(que<num[e-1]) then que:=num[e-1];
-
s:=s div 2;e:=e div 2;
-
end;
-
t:=que;
-
end;
-
-
begin
-
readln(n,d);
-
for i:=1 to n do
-
begin
-
read(c);readln(a);
-
if c='A' then add((t+a) mod d) else writeln(que(m-a+1,m));
-
end;
-
end.