裸的线段树。。
#include <cstdio>
using namespace std;
int m,d;
struct VV{
int l,r;
int ma;
}tr[800005];
inline int max(int i,int j) {return i>j?i:j;}
void build_tr(int l,int r,int k)
{
tr[k].l=l;tr[k].r=r;
if (l==r) return ;
int mid=(l+r)>>1;
tr[k].ma=-1;
build_tr(l,mid,k<<1);
build_tr(mid+1,r,(k<<1)+1);
return ;
}
void insert(int k,int we,int ans)
{
int l=tr[k].l,r=tr[k].r;
if (l==r)
{
tr[k].ma=ans;
return;
}
int mid=(l+r)>>1;
if (we<=mid) insert(k<<1,we,ans);
else insert((k<<1)+1,we,ans);
tr[k].ma=max(tr[k<<1].ma,tr[k<<1|1].ma);
return ;
}
int ask(int k,int x,int y)
{
int l=tr[k].l,r=tr[k].r;
if (y<l||x>r) return -1;
if (x<=l&&y>=r)
{
return tr[k].ma;
}
int mid=(l+r)>>1;
int ma=0;
if (y>mid) ma=max(ma,ask(k<<1|1,x,y));
if (x<=mid) ma=max(ma,ask(k<<1,x,y));
return ma;
}
int main()
{
register int i;
scanf("%d %d",&m,&d);
build_tr(1,m,1);
int qu=0;int le=0;
for (i=1;i<=m;i++)
{
char c='1';int x;
while(c!='A'&&c!='Q') c=getchar();
scanf("%d",&x);
if (c=='A') insert(1,++le,(qu+x)%d);
if (c=='Q') printf("%d\n",qu=ask(1,le-x+1,le));
}
return 0;
}