#include<cstdio>
#include<iostream>
#include<string>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<deque>
#include<queue>
#include<map>
#include<vector>
#include<stack>
#include<assert.h>
#include<set>
#define ls o<<1
#define rs o<<1|1
using namespace std;
typedef long long ll;
const int INF=0x3f3f3f3f;
const int N=4e5+1;
const int L=1e5;
const int M=N-1;
int n,minn;
int tr[N<<2];
int lazy[N<<2];
void pushup(int o)
{
tr[o]=tr[ls]+tr[rs];
}
void update(int o,int l,int r,int k,int x)
{
if(l==r)
{
tr[o]+=x;
return ;
}
int mid=(l+r)>>1;
if(k<=mid) update(ls,l,mid,k,x);
else update(rs,mid+1,r,k,x);
pushup(o);
}
void FG(int o,int l,int r,int L,int R)
{
if(l==r)
{
tr[o]=0;
return;
}
int mid=(l+r)>>1;
if(tr[ls] && L<=mid) FG(ls,l,mid,L,R);
if(tr[rs] && R>mid) FG(rs,mid+1,r,L,R);
pushup(o);
}
int query(int o,int l,int r,int L,int R)
{
if(l>R || r<L) return 0;
if(l>=L && r<=R) return tr[o];
int mid=(l+r)>>1;
return query(ls,l,mid,L,R)+query(rs,mid+1,r,L,R);
}
int queryK(int o,int l,int r,int k)
{
if(l==r) return l;
int mid=(l+r)>>1;
if(tr[ls]>=k) queryK(ls,l,mid,k);
else queryK(rs,mid+1,r,k-tr[ls]);
}
int f,g,ans;
int main()
{
scanf("%d%d",&n,&minn);
f=minn;
minn+=L;
while(n--)
{
char s=getchar();
while(!(s>='A' && s<='Z')) s=getchar();
int k;
scanf("%d",&k);
if(s=='I')
{
if(k<f) continue;
update(1,0,M,k-g+L,1);
}
if(s=='A')
{
minn-=k;
g+=k;
}
if(s=='S')
{
minn+=k;
g-=k;
if(minn>=1 && query(1,0,M,0,minn-1)>0)
{
ans+=query(1,0,M,0,minn-1);
FG(1,0,M,0,minn-1);
}
}
if(s=='F')
{
if(k>query(1,1,M,minn,M)) printf("-1\n");
else printf("%d\n",queryK(1,0,M,k)+g-L);
}
}
printf("%d\n",ans);
}