#include<cstdio>
#include<algorithm>
#include<iostream>
#include<cstring>
#define LL long long
using namespace std;
LL M,D;
LL maxn[800005];
LL tag;
char s[2];
LL mem;
LL x;
const LL INF=-0x7fffffff;
LL ls(LL p)
{
return p<<1;
}
LL rs(LL p)
{
return p<<1|1;
}
void push_up(LL p)
{
maxn[p]=max(maxn[ls(p)]%D,maxn[rs(p)]%D)%D;
}
void adder(LL p,LL nl,LL nr,LL l,LL r,LL k)
{
if(nl<=l&&nr>=r)
{
maxn[p]=k%D;
return;
}
LL mid=(l+r)>>1;
if(nl<=mid)
adder(ls(p),nl,nr,l,mid,k);
if(nr>mid)
adder(rs(p),nl,nr,mid+1,r,k);
push_up(p);
}
LL query(LL p,LL nl,LL nr,LL l,LL r)
{
if(nl<=l&&nr>=r)
{
return maxn[p]%D;
}
LL temp=INF%D;
LL mid=(l+r)>>1;
if(nl<=mid)
temp=max(temp,query(ls(p),nl,nr,l,mid));
if(nr>mid)
temp=max(temp,query(rs(p),nr,nr,mid+1,r));
return temp%D;
}
int main()
{
scanf("%lld%lld",&M,&D);
for(int i=1;i<=M;i++)
{
scanf("%s %lld",s,&x);
if(s[0]=='Q')
{
if(x==0)
mem=0;
else mem=query(1,tag-x+1,tag,1,M);
printf("%lld\n",mem);
}
else
{
x+=mem;
x%=D;
tag++;
adder(1,tag,tag,1,M,x);
}
}
return 0;
}
数组开的也不是很大,也足够了 但为什么就是一直mle呢。。。。