#include<bits/stdc++.h>
using namespace std;
const int N = 1e5 + 7;
struct treap{
int ls, rs;
int size, val, pri;
}t[N];
int q, m, ad;
int cnt;
int rt;
int s, num;
void newnode(int x){
cnt++;
t[cnt].ls = t[cnt].rs = 0;
t[cnt].size = 1;
t[cnt].val = x;
t[cnt].pri = rand();
}
void push_up(int u){
t[u].size = t[t[u].ls].size + t[t[u].rs].size + 1;
}
void rotate(int &u, int d){
int k;
if(d == 0){
k = t[u].rs;
t[u].rs = t[k].ls;
t[k].ls = u;
}
else{
k = t[u].ls;
t[u].ls = t[k].rs;
t[k].rs = u;
}
t[k].size = t[u].size;
push_up(u);
push_up(k);
u = k;
}
void insert(int &u, int x){
if(!u){
newnode(x);
u = cnt;
return;
}
t[u].size++;
if(x <= t[u].val) insert(t[u].ls, x);
else insert(t[u].rs, x);
if(t[u].ls && t[t[u].ls].pri < t[u].pri) rotate(u, 1);
if(t[u].rs && t[t[u].rs].pri < t[u].pri) rotate(u, 0);
push_up(x);
}
void del(int &u, int x){
if(!u) return;
if(t[u].val == x){
if(!t[u].ls || !t[u].rs){
u = t[u].ls + t[u].rs;
return;
}
if(t[t[u].ls].pri < t[t[u].rs].pri){
rotate(u, 1);
del(t[u].ls, x);
return;
}
else{
rotate(u, 0);
del(t[u].rs, x);
return;
}
}
if(x < t[u].val) del(t[u].ls, x);
else del(t[u].rs, x);
push_up(x);
}
int kth(int u, int k){
if(t[t[u].ls].size + 1 == k) return t[u].val;
else if(k <= t[t[u].ls].size) return kth(t[u].ls, k);
else return kth(t[u].rs, k - t[t[u].ls].size - 1);
}
int pre(int u, int x){
if(!u) return 0;
if(x <= t[u].val) return pre(t[u].ls, x);
int tmp = pre(t[u].rs, x);
if(tmp) return tmp;
else return t[u].val;
}
int main(){
srand(time(0));
scanf("%d%d%d", &q, &m);
while(q--){
char c;
int k;
cin >> c;
scanf("%d", &k);
if(c == 'I'){
if(k - ad >= m){
insert(rt, k - ad);
s++;
num++;
}
}
if(c == 'A'){
m -= k;
ad += k;
}
if(c == 'S'){
m += k;
ad -= k;
int p = pre(rt, m);
while(p){
del(rt, p);
p = pre(rt, p);
}
}
if(c == 'F'){
if(k > num) printf("-1\n");
else{
printf("%d\n", kth(rt, num - k + 1) + ad);
}
}
}
printf("%d", s - num);
return 0;
}