#include<iostream>
#include<cstring>
#include<string>
#include<cstdio>
#include<queue>
#include<cmath>
#include<vector>
#include<algorithm>
using namespace std;
long long jld;
long long m,d,t=0,aa=0;
long long ll,rr,kk;
long long mmax=-0x7fffffff;
long long top=1;
struct node{
long long maxx=0;
long long l,r;
}tree[5005000];
//vector<node> tree;
long long ans=0;
void ddxg(long long l,long long r,long long n) {
if(l>aa||r<aa)return;
if(l==r&&r==aa){
tree[n].maxx=jld;
// cout <<">>:"<<n<<endl;
return;
}
ddxg(l,(l+r)/2,tree[n].l);
ddxg((l+r)/2+1,r,tree[n].r);
tree[n].maxx=max(tree[tree[n].l].maxx,tree[tree[n].r].maxx);
}
void build(long long l,long long r,long long n){
tree[n].l=++top;
tree[n].r=++top;
if(l==r){
tree[n].maxx=jld%d;
return;
}
build(l,(l+r)/2,tree[n].l);
build((l+r)/2+1,r,tree[n].r);
tree[n].maxx=max(tree[tree[n].l].maxx,tree[tree[n].r].maxx);
}
void qjcx(long long l, long long r,long long n){
if(ll<=l&&r<=rr){
if(mmax<tree[n].maxx)mmax=tree[n].maxx;
return;
}
if(ll<=(l+r)/2)qjcx(l,(l+r)/2,tree[n].l);
if(rr>(l+r)/2)qjcx((l+r)/2+1,r,tree[n].r);
}
int main(){
cin >>m>>d;
build(1,109000,1);
for(long long i=1;i<=m;i++){
char pp;
long long qq;
ans=0;
cin >>pp;
if(pp=='A'){
cin >>qq;
aa++;
jld=(qq+t)%d;
ddxg(1,109000,1);
// cout <<aa<<endl;jajjiny kadokiny
// long long t=1,t1=1;
// for(long long j=1;j<=9;j++){
// cout <<j<<":["<<tree[j].l<<" "<<tree[j].r<<"]"<<"("<<tree[j].maxx<<") ";
// if(t==j){
// cout <<endl;
// t+=2*t1;
// t1++;
// }
// }
// cout <<endl;
}
if(pp=='Q'){
cin >>qq;
ll=aa-qq+1;
rr=aa;
qjcx(1,109000,1);
cout <<mmax%d<<endl;
t=mmax;
mmax=-0x7fffffff;
}
}
return 0;
}