#9 MLE
#2、#5~#8、#10 RE
#include<bits/stdc++.h>
using namespace std;
struct Tree{
int cnt,ROOT,X,Y,Z;
int L[300010],R[300010],Size[300010],Key[300010],value[300010];
void update(int k){
Size[k]=Size[L[k]]+Size[R[k]]+1;
}
void spilt(int Root,int Value,int &x,int &y){
if(!Root){
x=y=0;
return;
}
if(value[Root]<=Value){
x=Root;
spilt(R[Root],Value,R[Root],y);
}else{
y=Root;
spilt(L[Root],Value,x,L[Root]);
}
update(Root);
}
int merge(int x,int y){
if(!x||!y) return x+y;
if(Key[x]>Key[y]){
R[x]=merge(R[x],y);
update(x);
return x;
}else{
L[y]=merge(x,L[y]);
update(y);
return y;
}
}
int New(int Value){
cnt++;
value[cnt]=Value;
Size[cnt]=1;
Key[cnt]=rand();
return cnt;
}
void insert(int Value){
Z=New(Value);
spilt(ROOT,Value,X,Y);
ROOT=merge(merge(X,Z),Y);
}
void Del(int Value){
spilt(ROOT,Value,X,Z);
spilt(X,Value-1,X,Y);
Y=merge(L[Y],R[Y]);
ROOT=merge(merge(X,Y),Z);
}
int Get_rk(int Value){
spilt(ROOT,Value-1,X,Y);
int res=Size[X]+1;
ROOT=merge(X,Y);
return res;
}
int Get_value(int rk){
int RT=ROOT;
while(RT){
if(Size[L[RT]]+1==rk){
break;
}
if(Size[L[RT]]>=rk){
RT=L[RT];
}else{
rk-=(Size[L[RT]]+1);
RT=R[RT];
}
}
return value[RT];
}
int pre(int v){
return Get_value(Get_rk(v)-1);
}
int nxt(int v){
return Get_value(Get_rk(v+1));
}
}tr;
int n,Min,cnt,Cnt,Sum;
int x;
void Work_I(){
if(x>=Min){
Cnt++;
tr.insert(x);
}
return;
}
int Vdt[300010];
void Work_A(){
for(int i=1;i<=Cnt;i++){
Vdt[i]=tr.Get_value(i);
}
for(int i=1;i<=Cnt;i++){
tr.Del(Vdt[i]);
tr.insert(Vdt[i]+x);
}
}
void Work_S(){
int Dt1=0;
for(int i=1;i<=Cnt;i++){
Vdt[i]=tr.Get_value(i);
}
for(int i=1;i<=Cnt;i++){
if(Vdt[i]-x<Min){
tr.Del(Vdt[i]);
cnt++;
Dt1++;
}else{
tr.Del(Vdt[i]);
tr.insert(Vdt[i]-x);
}
}
Cnt-=Dt1;
return;
}
int Work_F(){
return tr.Get_value(Cnt-x+1);
}
main(){
// freopen("P1486_2.in","r",stdin);
// freopen("P1486_2.ans","w",stdout);
cin>>n>>Min;
for(int i=1;i<=n;i++){
char op;
cin>>op>>x;
if(op=='I') Work_I();
if(op=='A') Work_A();
if(op=='S') Work_S();
if(op=='F') cout<<(x>Cnt?-1:Work_F())<<"\n";
}
cout<<cnt;
}