#include<bits/stdc++.h>
using namespace std;
const int N=4e5+10;
const int len=2e5;
#define lc p<<1
#define rc p<<1|1
int n,m;
int a[N],tree[N*4],tag[N*4];
char s;
inline void push_up(int p){
tree[p]=tree[lc]+tree[rc];
}
inline void update(int p,int l,int r,int x,int y){
if(l==r){
tree[p]+=y;
return;
}
int mid=(l+r)>>1;
if(x<=mid) update(lc,l,mid,x,y);
else update(rc,mid+1,r,x,y);
push_up(p);
}
inline int query(int p,int l,int r,int x,int y){
if(x<=l && r<=y) return tree[p];
int mid=l+r>>1,ans=0;
if(x<=mid) ans+=query(lc,l,mid,x,y);
if(y>mid) ans+=query(rc,mid+1,r,x,y);
return ans;
}
int minn;
inline int top_10(int p,int l,int r,int x){
if(l==r) return l;
int mid=l+r>>1,l1=-1,r1=-1;
if(minn<l) l1=tree[lc];
else if(l<=minn && minn<=mid) l1=query(lc,l,mid,minn,mid);
else if(mid<minn && minn<=r) r1=query(rc,mid+1,r,minn,r);
else r1=tree[rc];
if(r1==-1) r1=tree[p]-l1;
l1=tree[p]-r1;
if(r1>=x) return top_10(rc,mid+1,r,x);
else return top_10(lc,l,mid,x-r1);
}
inline void clear(int p,int l,int r,int x,int y){
if(l==r){
tree[p]=0;
return;
}
int mid=l+r>>1;
if(x<=mid && tree[lc]) clear(lc,l,mid,x,y);
if(y>mid && tree[rc]) clear(rc,mid+1,r,x,y);
push_up(p);
}
signed main(){
cin.tie(0);cout.tie(0);
ios::sync_with_stdio(false);
cin>>n>>m;
int lm=m,b=0;
m+=len;
int ans=0;
for(int i=1;i<=n;i++){
int x;
cin>>s>>x;
if(s=='I'){
if(x<lm) continue;
update(1,0,N-1,x-b+len,1);
}else if(s=='A') m-=x,b+=x;
else if(s=='S'){
m+=x,b-=x;
if(m>=1 && query(1,0,N-1,m,N-1)>0){
ans+=query(1,0,N-1,0,m-1);
clear(1,0,N-1,0,m-1);
}
}else{
if(x>query(1,1,N-1,m,N-1)) cout<<-1<<'\n';
else cout<<top_10(1,0,N-1,x)+b-len<<'\n';
}
}
cout<<ans;
return 0;
}