#include<bits/stdc++.h>
#define N 300010
using namespace std;
inline int read(){
int x=0,f=1;
char a=getchar();
while(a<'0'||a>'9'){if(a=='-')f=-1;a=getchar();}
while(a>='0'&&a<='9'){x=x*10+a-'0';a=getchar();}
return x*f;
}
struct node{
int son[2];
int fa;
int inx;
int cnt;
int siz;
void init(int p1,int v1){
fa=p1;
inx=v1;
cnt=siz=1;
}
};
node tree[N];
int root,tot;
int n,minn,realn;
int delt;
void update(int x){
int l=tree[x].son[0],r=tree[x].son[1];
tree[x].siz =tree[l].siz +tree[r].siz +tree[x].cnt ;
}
void rotate(int x){
int y=tree[x].fa ,z=tree[y].fa ;
int k=tree[y].son[1]==x;
tree[y].son[k]=tree[x].son[k^1];
tree[y].fa =x;
tree[tree[x].son[k^1]].fa =y;
tree[x].son[k^1]=y;
tree[x].fa =z;
tree[z].son[tree[z].son[1]==y]=x;
update(x);update(y);
}
void splay(int x,int k){
while(tree[x].fa !=k){
int y=tree[x].fa ;int z=tree[y].fa ;
if(z!=k){
if((tree[z].son[0]==y)^(tree[y].son[0]==x) ) rotate(y);
else rotate(x);
}
rotate(x);
}
if(k==0) root=x;
}
void insert(int v){
int x=root;
int fa=x;
while(v!=tree[x].inx&&x){
fa=x;
x=tree[x].son[v>tree[x].inx ];
}
if(x) tree[x].cnt ++;
else{
x=++tot;
tree[fa].son [v>tree[fa].inx ]=x;
tree[x].init(fa,v);
}
splay(x,0);
}
void find(int v){
int x=root;
while(tree[x].son[v>tree[x].inx]&&v!=tree[x].inx ){
x=tree[x].son[v>tree[x].inx];
}
splay(x,0);
}
int get_pre(int v){
find(v);
int x=root;
if(tree[x].inx <v){
return x;
}
x=tree[x].son[0];
while(tree[x].son[1]) x=tree[x].son[1];
return x;
}
int get_suc(int v){
find(v);
int x=root;
if(tree[x].inx>v){
return x;
}
x=tree[x].son[1];
while(tree[x].son[0]) x=tree[x].son[0];
return x;
}
void del(int v){
int pre=get_pre(v);
int suc=get_suc(v);
splay(pre,0);splay(suc,pre);
int del=tree[suc].son[0];
if(tree[del].cnt >1){
tree[del].cnt --;splay(del,0);
}
else{
tree[suc].son[0]=0;
splay(suc,0);
}
}
int get_rank(int v){
find(v);
return tree[tree[root].son[0]].siz ;
}
int get_val(int k){
int x=root;
while(1){
int y=tree[x].son[0];
if(tree[y].siz+tree[x].cnt <k){
k-=tree[y].siz+tree[x].cnt;
x=tree[x].son[1];
}
else{
if(tree[y].siz >=k)x=tree[x].son[0];
else break;
}
}
splay(x,0);
return tree[x].inx ;
}
int main(){
n=read();minn=read();
insert(-1e9);insert(1e9);
for(int i=1;i<=n;i++){
char a=getchar();
if(a=='I'){
int k=read();
if (k<minn) continue;
insert(k-delt);
realn++;
}
else if(a=='A'){
int k=read();
delt+=k;
}
else if(a=='S'){
int k=read();
delt-=k;
insert(minn-delt);
find(-1e9);
int p=root;
find(minn-delt);
int q=root;
splay(p,0);
splay(q,p);
tree[tree[root].son [1]].son[0]=0;
del(minn-delt);
}
else if(a=='F'){
int k=read();
int realnum=get_rank(1e9)-1;
if(realnum<k){
printf("-1");
}
else{
printf("%d",get_val(realnum-k+2)+delt);
}
cout<<endl;
}
}
cout<<realn-(get_rank(1e9)-1);
return 0;
}