线段树水题
#include<cstdio>
#include<cstdlib>
#include<cstring>
struct mod{int l,r,lc,rc,c;};
mod tr[400005];
int trlen=0;
char s[5];
int mymax(int u1,int u2)
{
if(u1>u2)
return u1;
return u2;
}
int build(int l,int r)
{
trlen++;
int now=trlen;
tr[now].l=l;
tr[now].r=r;
tr[now].c=-10000000;
if(l==r)return now;
int mid=l+r>>1;
tr[now].lc=build(l,mid);
tr[now].rc=build(mid+1,r);
return now;
}
void change(int now,int p,int c)
{
if(tr[now].l==tr[now].r)
{
tr[now].c=c;
return;
}
int mid=tr[now].l+tr[now].r>>1;
int lc=tr[now].lc,rc=tr[now].rc;
if(p<=mid) change(lc,p,c);
else change(rc,p,c);
tr[now].c=mymax(tr[lc].c,tr[rc].c);
}
int get(int now,int l,int r)
{
if(tr[now].l==l&&tr[now].r==r)
return tr[now].c;
int mid=tr[now].l+tr[now].r>>1;
int lc=tr[now].lc,rc=tr[now].rc;
if(r<=mid)return get(lc,l,r);
else if (mid+1<=l) return get(rc,l,r);
else return mymax(get(lc,l,mid),get(rc,mid+1,r));
}
int main()
{
int m,t=0,d;
scanf("%d%d",&m,&d);
build(1,m);
int n=0;
for(int i=1;i<=m;i++)
{
int o;
scanf("%s",s);
scanf("%d",&o);
if(s[0]=='A')
{
int soy=o+t;
soy%=d;
n++;
change(1,n,soy);
}
else
{
t=get(1,n-o+1,n);
printf("%d\n",t);
}
}
}