#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=200010;
int tr[N*4];
void pushup(int u)
{
tr[u]=max(tr[u<<1],tr[u<<1|1]);
}
void build(int u,int l,int r)
{
if(l==r)
{
tr[u]=0;
return;
}
int mid=l+r>>1;
build(u<<1,l,mid),build(u<<1|1,mid+1,r);
pushup(u);
}
int find(int u,int l,int r,int s,int e)
{
if(s<=l&&e>=r)
{
return tr[u];
}
int mid=l+r>>1;
int res = 0;
if(s<=mid)res=find(u<<1,l,mid,s,e);
if(e>=mid+1)res=max(res,find(u<<1|1,mid+1,r,s,e));//+1漏了 |1漏了
return res;
}
void update(int u,int l,int r,int x,int c)
{
if(l==x && r==x)
{
tr[u]=c;
return;
}
int mid=l+r>>1;
if(x<=mid)update(u<<1,l,mid,x,c);
else if(x>=mid+1)update(u<<1|1,mid+1,r,x,c);
pushup(u);
}
int main()
{
int m,p,n=0,last=0;
cin>>m>>p;
build(1,1,m);//二刷漏了
int tot=m;
while(m--)//作为树最大范围不能动态减,所以赋值给tot
{
char op[2];
int x;
cin>>op>>x;
if(op[0]=='A')
{
update(1,1,tot,n+1,(x+last)%p);
n++;
}
else
{
last = find(1,1,tot,n-x+1,n);
cout<<last<<endl;
}
}
return 0;
}