#include<bits/stdc++.h>
#define int long long
using namespace std;
struct tree{
int val,tag;
}tree[400005<<2];
int a[400005],p;
int mod;
inline int ls(int p){
return p<<1;
}
inline int rs(int p){
return p<<1|1;
}
inline void pushup(int p){
tree[p].val=max(tree[ls(p)].val,tree[rs(p)].val);
}
inline void pushdown(int l,int r,int p){
int mid=l+r>>1;
tree[ls(p)].tag+=tree[p].tag;
tree[rs(p)].tag+=tree[p].tag;
tree[ls(p)].val+=tree[p].tag*(mid-l+1);
tree[rs(p)].val+=tree[p].tag*(r-mid);
tree[p].tag=0;
}
inline void build(int l,int r,int p){
if(l==r){
tree[p].val=a[l];
return;
}
int mid=l+r>>1;
build(l,mid,ls(p));
build(mid+1,r,rs(p));
pushup(p);
}
inline void update(int l,int r,int ql,int qr,int p,int k){
if(l>qr||r<ql){
return;
}
if(qr>=r&&ql<=l){
tree[p].val=max(tree[p].val,k);
return;
}
int mid=l+r>>1;
update(l,mid,ql,qr,ls(p),k);
update(mid+1,r,ql,qr,rs(p),k);
pushup(p);
}
inline int query(int l,int r,int ql,int qr,int p){
if(l>qr||r<ql)return 0;
if(qr>=r&&ql<=l){
return tree[p].val;
}
if(l==r)return tree[p].val;
int mid=l+r>>1;
return max(query(l,mid,ql,qr,ls(p)),query(mid+1,r,ql,qr,rs(p)));
}
signed main(){
int m;
cin>>m>>mod;
int t=0;
while(m--){
char op;
cin>>op;
if(op=='Q'){
int l;
cin>>l;
t=query(1,p,p-l+1,p,1);
// cout<<p-l+1<<" "<<p<<endl;
cout<<query(1,p,p-l+1,p,1)<<endl;
}
else{
int n;
cin>>n;
n+=t;
p++;
update(1,p,p,p,1,n%mod);
}
//for(int i=1;i<=4*p;i++){
// cout<<tree[p].val<<" ";
// }
cout<<endl;
}
return 0;
}