#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=200100;
struct node{
ll l,r;
ll num;
}tree[4*N];
void build(int p,int l,int r){//递归建树
tree[p].l=l,tree[p].r=r;
if(l==r){//如果结点是叶子结点
tree[p].num=0;
return ;
}
int mid=(l+r)/2;
build(p*2,l,mid);//建立左子树
build(p*2+1,mid+1,r);//建立右子树
tree[p].num=max(tree[p*2].num,tree[p*2+1].num);//该结点的和等于左子树的和加上右子树的和
}
void insert(int p,int pos,int k){//插入操作
if(tree[p].l==pos&&tree[p].r==pos){//如果该节点是叶子结点,并且是要插入的位置把该点的值更改,并返回
tree[p].num=k;
return ;
}
int mid=(tree[p].l+tree[p].r)/2;
if(pos<=mid)insert(p*2,pos,k);//如果该位置小于区间中值,向左子树查找
else insert(p*2+1,pos,k);//否则向右子树查找
tree[p].num=max(tree[p*2].num,tree[p*2+1].num);//顺便把该节点的最大值更新
}
int check(int p,int l,int r){//查询操作
if(tree[p].l>=l&&tree[p].r<=r){//如果该节点在要查询区间范围内,直接返回该结点的最大值
return tree[p].num;
}
int mid=(tree[p].l+tree[p].r)/2;
ll m1=0,m2=0;
if(l<=mid)m1=check(p*2,l,r);//如果区间与右子树有交集,查询右子树
if(r>mid)m2=check(p*2+1,l,r);//如果区间与左子树有交集,查询左子树
return max(m1,m2);
}
int pre=0,cnt=0;
int main(){
ll n,m;
cin>>n>>m;
build(1,1,N);//建树
while(n--){
char a;
ll k;
cin>>a>>k;
if(a=='A'){//插入操作
// cout<<"/"<<k+t<<endl;
ll nu=(k+pre)%m;
// cout<<"nu"<<nu<<endl;
cnt++;
insert(1,cnt,nu);
}
else {//查询操作
pre=check(1,cnt-k+1,cnt);
cout<<pre<<endl;
}
}
return 0;
}