#include<cstdio>
#define int long long
const int INF=1e13;
int a[200005];
int m,d;
int t;
int len;
struct node
{
int l,r;
int maxn;
};
struct seg
{
node t[800005];
int max(int a,int b)
{
return a>b?a:b;
}
void build(int k,int l,int r)
{
t[k].l=l,t[k].r=r;
if(l==r)
{
t[k].maxn=a[l];
return ;
}
int mid=(l+r)>>1;
build(2*k,l,mid);
build(2*k,mid+1,r);
t[k].maxn=max(t[2*k].maxn,t[2*k+1].maxn);
}
void update(int k,int num,int x)
{
if(t[k].l==t[k].r)
{
t[k].maxn=num;
return ;
}
int mid=(t[k].l+t[k].r)>>1;
if(x<=mid) update(2*k,num,x);
else update(2*k+1,num,x);
t[k].maxn=max(t[2*k].maxn,t[2*k+1].maxn);
}
int query(int k,int l,int r)
{
if(t[k].l>=l&&t[k].r<=r) return t[k].maxn;
int mid=(t[k].l+t[k].r)>>1;
int ans=-INF;
if(l<=mid) ans=max(ans,query(2*k,l,r));
if(r>mid) ans=max(ans,query(2*k+1,l,r));
return ans;
}
}tree;
signed main()
{
scanf("%lld%lld",&m,&d);
for(int i=1;i<=m;i++) a[i]=-INF;
tree.build(1,1,m);
while(m--)
{
char op;
int x;
scanf(" %c %lld",&op,&x);
if(op=='Q')
{
if(!x) t=0;
else t=tree.query(1,len-x+1,len);
printf("%lld\n",t);
}
else
{
x+=t;
x%=d;
tree.update(1,x,++len);
}
}
return 0;
}
连样例都RE,查不动了......