#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;
const int MX = 100205;
struct node {
int ch[2];
int siz, val, rnd;
}t[MX];
int q, low;
int root, tot;
void update(int id) {
t[id].siz = t[t[id].ch[0]].siz + t[t[id].ch[1]].siz + 1;
}
int newNode(int val) {
t[++tot].siz = 1;
t[tot].val = val;
t[tot].rnd = rand();
return tot;
}
inline void split(int id, int val, int &x, int &y) {
if(!id) return (void)(x = y = 0);
else {
if(val < t[id].val) {
y = id;
split(t[id].ch[0], val, x, t[id].ch[0]);
} else {
x = id;
split(t[id].ch[1], val, t[id].ch[1], y);
}
update(id);
}
}
int merge(int x, int y) {
if(!x || !y) return x + y;
if(t[x].rnd <= t[y].rnd) {
int k = (t[y].val > t[x].val ? 1 : 0);
t[x].ch[k] = merge(t[x].ch[k], y);
update(x);
return x;
}
int k = (t[x].val > t[y].val ? 1 : 0);
t[y].ch[k] = merge(x, t[y].ch[k]);
update(y);
return y;
}
void insert(int id, int val) {
int t1, t2;
split(root, val, t1, t2);
root = merge(t1, merge(newNode(val), t2));
}
inline int kth(int id, int k){
if(!id) return 0;
int lsiz = t[t[id].ch[0]].siz;
if(k < lsiz) return kth(t[id].ch[0], k);
if(k > lsiz) return kth(t[id].ch[1], k - lsiz - 1);
return t[id].val;
}
int mov = 0, ans = 0;
int main(){
srand((unsigned)time(NULL));
cin >> q >> low;
while(q--){
char op;
int val;
cin >> op >> val;
switch(op){
case 'I':
if(val - mov < low) break;
insert(root, val - mov);
break;
case 'A':
low -= val;
mov += val;
break;
case 'S':
low += val;
mov -= val;
int x, y;
split(root, low - 1, x, y);
root = y;
ans += t[x].siz;
break;
default:
if(t[root].siz < val) {
cout << -1 << endl;
break;
}
cout << kth(root, t[root].siz - val) + mov << endl;
break;
}
}
cout << ans;
return 0;
}