#include<bits/stdc++.h>
#define int long long
#define lson(root) (root << 1)
#define rson(root) (root << 1 | 1)
using namespace std;
struct node
{
int mx;
}tree[800010];
int m , mod , cnt , lst;
void pushup(int root)
{
tree[root].mx = max(tree[lson(root)].mx , tree[rson(root)].mx);
}
void update(int root , int l , int r , int pos , int val)
{
if(l == r)
{
tree[root].mx = val;
return;
}
int mid = (l + r) >> 1;
if(pos <= mid) update(lson(root) , l , mid , pos , val);
else update(rson(root) , mid + 1 , r , pos , val);
pushup(root);
}
int query(int root , int l , int r , int L , int R)
{
if(L <= l && R >= r) return tree[root].mx;
int mid = (l + r) >> 1 , mx = 0;
if(L <= mid) mx = max(mx , query(lson(root) , l , mid , L , R));
if(R > mid) mx = max(mx , query(rson(root) , mid + 1 , r , L , R));
return mx;
}
void build(int root , int l , int r)
{
if(l == r)
{
tree[root].mx = -1e18;
return;
}
int mid = (l + r) >> 1;
build(lson(root) , l , mid);
build(rson(root) , mid + 1 , r);
pushup(root);
}
signed main()
{
scanf("%lld%lld" , &m , &mod);
build(1 , 1 , m);
for(int i = 1 ; i <= m ; i ++)
{
char op;
int x;
cin >> op; scanf("%lld" , &x);
x %= mod;
if(op == 'Q') lst = query(1 , 1 , m , cnt - x + 1 , cnt) , printf("%lld\n" , lst);
else cnt ++ , update(1 , 1 , m , cnt , lst);
}
return 0;
}