#include<bits/stdc++.h>
#define int long long
using namespace std;
int q,minn,rt,l,r,px;
int qwq=0,sum=0,ans=0,cnt=0;
struct node{
int l,r,siz,val,randval;
}Treap[1145141];
void pushup(int p){
Treap[p].siz=Treap[Treap[p].l].siz+Treap[Treap[p].r].siz+1;
return ;
}
void build(int x){
++cnt;
Treap[cnt].l=Treap[cnt].r=0;
Treap[cnt].siz=1;
Treap[cnt].val=x;
Treap[cnt].randval=rand()%201019;
return ;
}
void Split(int p,int val,int &l,int &r){
if(!p){
l=r=0;
return ;
}
if(Treap[p].val<=val){
l=p;
Split(Treap[p].r,val,Treap[p].r,r);
}else{
r=p;
Split(Treap[p].l,val,l,Treap[p].l);
}
pushup(p);
return ;
}
int Merge(int l,int r){
if(!l||!r) return l+r;
if(Treap[l].randval<=Treap[r].randval){
Treap[l].r=Merge(Treap[l].r,r);
pushup(l);
return l;
}
Treap[r].l=Merge(l,Treap[r].l);
pushup(r);
return r;
}
void Insert(int x){
Split(rt,x,l,r);
build(x);
rt=Merge(Merge(l,cnt),r);
return ;
}
void Delete(int x){
Split(rt,x,l,r);
Split(l,x-1,l,px);
px=Merge(Treap[px].l,Treap[px].r);
rt=Merge(Merge(l,px),r);
return ;
}
int rk(int p,int k){
if(k==Treap[Treap[p].l].siz+1) return p;
if(k<Treap[Treap[p].l].siz+1) return rk(Treap[p].l,k);
k-=Treap[Treap[p].l].siz+1;
return rk(Treap[p].r,k);
}
int pre(int x){
Split(rt,x-1,l,r);
int now=l;
while(Treap[now].r) now=Treap[now].r;
int qans=Treap[now].val;
rt=Merge(l,r);
return qans;
}
signed main(){
srand(20111019);
cin>>q>>minn;
while(q--){
char op;
int x;
cin>>op>>x;
if(op=='I'){
if(x+qwq<minn) continue;
Insert(x+qwq);
}
if(op=='A'){
qwq-=x;
minn-=x;
while(pre(minn)){
Delete(pre(minn));
ans++;
}
}
if(op=='S'){
qwq+=x;
minn+=x;
while(pre(minn)){
Delete(pre(minn));
ans++;
}
}
if(op=='F'){
if(x>Treap[rt].siz) printf("-1\n");
else cout<<Treap[rk(rt,Treap[rt].siz-x+1)].val-qwq<<endl;
}
}
cout<<ans<<endl;
return 0;
}