线段树全部 MLE
//By: Luogu@wangdemao(308854)
#include <iostream>
#include <cstring>
#define ull unsigned long long
using namespace std;
const int INF=0x3f3f3f3f;
struct Node
{
int Min=0,Max=0;
};
Node a[800000];
int n,d;
inline int lc(int u)
{
return u<<1;
}
inline int rc(int u)
{
return (u<<1)+1;
}
void PushUp(int u)
{
a[u].Max=max(a[lc(u)].Max,a[rc(u)].Max)%d;
}
void MakeTree(int u,int l,int r)
{
if(l==r)
{
a[u].Max=-INF;
return ;
}
int mid=(l+r)/2;
MakeTree(lc(u),l,mid);
MakeTree(rc(u),mid+1,r);
a[u].Max=-INF;
return ;
}
void ChangePoint(int u,int l,int r,int val,int id)
{
if(l>=r)
{
a[u].Max=val;
return ;
}
int mid=(l+r)/2;
a[u].Max=max(a[u].Max,val);
if(id<=mid)
ChangePoint(lc(u),l,mid,val,id);
else
ChangePoint(rc(u),mid+1,r,val,id);
}
int QueryMax(int u,int l,int r,int ql,int qr)
{
if(ql<=l && r<=qr)
{
return a[u].Max%d;
}
int ans=-INF;
int mid=(l+r)/2;
if(ql<=mid)
{
ans=max(ans,QueryMax(lc(u),l,mid,ql,qr))%d;
}
if(qr>mid)
{
ans=max(ans,QueryMax(rc(u),mid+1,r,ql,qr))%d;
}
return ans;
}
signed main()
{
int m,lastt=0,cnt=0;
cin>>m>>d;
MakeTree(1,1,m);
while(m--)
{
char x;
cin>>x;
if(x=='A')
{
//memset(a,0,sizeof(a));
int n;
cin>>n;
ChangePoint(1,1,m,(n%d+lastt%d)%d,cnt);
//cout<<a[1].Max<<endl;
}
if(x=='Q')
{
int L;
cin>>L;
// for(int i=1;i<=3;i++)
// cout<<a[i].Max<<" ";
// cout<<endl;
lastt=QueryMax(1,1,m,cnt-L+1,cnt)%d;
cout<<lastt%d<<endl;
}
}
return 0;
}