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.

 

posted @ 2014-07-01 11:41  NanoApe  阅读(95)  评论(0编辑  收藏  举报
AmazingCounters.com