link
#include <bits/stdc++.h>
#define go continue
#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#define fory(i,a,b) for(int i = a; i <= b; ++i)
//-----
#define int long long
//-----
using namespace std;
template <typename T> inline void read(T& t)
{
int f = 0, c = getchar();
t = 0;
while (!isdigit(c)) f |= c == '-', c = getchar();
while (isdigit(c)) t = t * 10 + c - 48, c = getchar();
if (f) t = -t;
}
template <typename T> void print(T x)
{
if (x < 0) x = -x, putchar('-');
if (x > 9) print(x / 10);
putchar(x % 10 + 48);
}
inline void _sort(int* a, int l, int id)
{
id == 1 ? sort(a + 1, a + 1 + l, less<int>()) : sort(a + 1, a + 1 + l, greater<int>());
}
//--------------------------------------------
const int N = 200010;
struct node
{
int l, r, num;
};
int m, p;
struct _segment_tree
{
node t[N << 2];
int mp[N];
void push_up(int root)
{
int h = root << 1;
t[root].num = max(t[h].num, t[h + 1].num);
}
void build(int root, int l, int r)
{
t[root].l = l;
t[root].r = r;
if(l != r)
{
int mid = (l + r) >> 1;
int h = root << 1;
build(h, l, mid);
build(h + 1, mid + 1, r);
//push_up(root);
}
else
{
mp[l] = root;
}
}
void change(int x, int y)
{
x = mp[x];
t[x].num = y;
while(x >>= 1) push_up(x);
}
int query(int root, int l, int r)
{
if(t[root].l == l && t[root].r == r)
{
return t[root].num;
}
int mid = (t[root].l + t[root].r) >> 1;
int h = root << 1;
if(r <= mid) return query(h, l, r);
else if(l > mid) return query(h + 1, l, r);
else return max(query(h, l, mid), query(h + 1, mid + 1, r));
}
};
_segment_tree st;
signed main()
{
IOS;
int n = 0, last = 0;
cin >> m >> p;
st.build(1, 1, m);
int x;
string op;
while(m--)
{
cin >> op >> x;
if(op == "Q")
{
last = st.query(1, n - x + 1, n);
cout << last << "\n";
}
else
{
st.change(n + 1, (last + x) % p);
n++;
}
}
return 0;
}