成绩
#include<iostream>
#include<cstdio>
using namespace std;
const int maxn=500010,inf=1000000010;
int n,tot,root,minn;
int sum=0,num=0;
struct Node{
int lc,rc,val,cnt,size,pri;
#define lc(x)t[x].lc
#define rc(x)t[x].rc
#define v(x)t[x].val
#define p(x)t[x].pri
#define c(x)t[x].cnt
#define s(x)t[x].size
}t[maxn];
int Rand(){
static long long res=114514;
return (res*=2333)%inf;
}
void upt(int k){s(k)=s(lc(k))+s(rc(k))+c(k);}
void zig(int &k){
int y=lc(k);
lc(k)=rc(y);
rc(y)=k;
s(y)=s(k);
upt(k);k=y;upt(k);
}
void zag(int &k){
int y=rc(k);
rc(k)=lc(y);
lc(y)=k;
s(y)=s(k);
upt(k);k=y;upt(k);
}
void insert(int &k,int key){
if(!k){
k=++tot;rc(k)=lc(k)=0;
p(k)=Rand();c(k)=s(k)=1;v(k)=key;
upt(k);
return;
}
++s(k);
if(key==c(k))c(k)++;
else if(key<v(k)){
insert(lc(k),key);
if(p(lc(k))<p(k))zig(k);
}else{
insert(rc(k),key);
if(p(rc(k))<p(k))zag(k);
}
return;
}
void del(int &k,int key){
if(!k)return;
if(v(k)==key){
if(c(k)>1)--c(k),--s(k);
else if(!lc(k)||!rc(k))k=lc(k)+rc(k);
else if(p(lc(k))<p(rc(k)))zig(k),del(rc(k),key);
else zag(k),del(lc(k),key);
upt(k);return;
}
if(key<v(k))del(lc(k),key);
else del(rc(k),key);
upt(k);return;
}
int qkth(int k){
int x=root;
while(x){
if(s(lc(x))<k&&s(lc(x))+c(x)>=k)return v(x);
if(s(lc(x))>=k)x=lc(x);
else k-=(s(lc(x))+c(x)),x=rc(x);
}
return -1;
}
int pre(int key){
int x=root,res=-inf;
while(x){
if(v(x)==key)return v(x);
if(v(x)<key)res=v(x),x=rc(x);
else x=lc(x);
}
return res;
}
int nex(int key){
int x=root,res=inf;
while(x){
if(v(x)>key)res=v(x),x=lc(x);
else x=rc(x);
}
return res;
}
int main(){
int s=0,num=0,sum=0;
scanf("%d%d",&n,&minn);
for(int i=1;i<=n;i++){
int x;char opt;
cin>>opt;scanf("%d",&x);
if(opt=='I')if(x-sum>=minn)insert(root,x-sum),num++,s++;
if(opt=='F'){
if(num<x)printf("-1\n");
else printf("%d\n",qkth(num-x+1)+sum);
}
if(opt=='A')minn-=x,sum+=x;
if(opt=='S'){
minn+=x;sum-=x;
int a=minn-1,b;
a=pre(a);
while(pre(a)!=-inf){
b=a;a=pre(a);
del(root,pre(b));
num--;
}
}
}
printf("%d\n",s-num);
}