rt
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=3e5+5,INF=(int)4e18+5,inf=1e9+5;
struct data1
{
int val,siz,cnt;
data1 *ls,*rs,*fa;
data1(){val=siz=cnt=0;}
data1(int a,int b,int c,data1 *d,data1 *e,data1 *f){val=a,siz=b,cnt=c,ls=d,rs=e,fa=f;}
}*null;
class Splay_tree
{
private:
int tot;
data1 node[N*2],*root;
data1 *new_node(int val)
{
node[++tot]=data1(val,1,1,null,null,null);
return node+tot;
}
void push_up(data1 *u)
{
u->siz=u->cnt;
if(u->ls!=null)u->siz+=u->ls->siz;
if(u->rs!=null)u->siz+=u->rs->siz;
}
void zig(data1 *u)
{
data1 *fa=u->fa,*fafa=fa->fa;
fa->ls=u->rs;
if(u->rs!=null)u->rs->fa=fa;
push_up(fa);
u->rs=fa,fa->fa=u;
u->fa=fafa;
push_up(u);
if(fafa!=null)
{
if(fafa->ls==fa)fafa->ls=u;
else fafa->rs=u;
}
}
void zag(data1 *u)
{
data1 *fa=u->fa,*fafa=fa->fa;
fa->rs=u->ls;
if(u->ls!=null)u->ls->fa=fa;
push_up(fa);
u->ls=fa,fa->fa=u;
u->fa=fafa;
push_up(u);
if(fafa!=null)
{
if(fafa->ls==fa)fafa->ls=u;
else fafa->rs=u;
}
}
void splay(data1 *u,data1 *v)
{
while(u->fa!=v)
{
data1 *fa=u->fa,*fafa=fa->fa;
if(fafa==v)
{
if(u==fa->ls)zig(u);
else zag(u);
}
else
{
bool f1=(u==fa->ls),f2=(fa==fafa->ls);
if(f1&&f2)zig(u),zig(u);
if(f1&&!f2)zig(u),zag(u);
if(!f1&&f2)zag(u),zig(u);
if(!f1&&!f2)zag(u),zag(u);
}
}
if(u->fa==null)root=u;
}
data1 *pre(data1 *u,int val,data1 *res)
{
if(u==null)return res;
if(u->val<val)return pre(u->rs,val,u);
return pre(u->ls,val,res);
}
data1 *nxt(data1 *u,int val,data1 *res)
{
if(u==null)return res;
if(u->val>val)return nxt(u->ls,val,u);
return nxt(u->rs,val,res);
}
void output(data1 *u)
{
if(u->ls!=null)output(u->ls);
cout<<u->val<<' ';
if(u->rs!=null)output(u->rs);
}
void updata(data1 *u,int val)
{
u->val+=val;
if(u->ls!=null)updata(u->ls,val);
if(u->rs!=null)updata(u->rs,val);
}
public:
void init()
{
null=node+(tot=0);
data1 *u=new_node(INF);
root=new_node(-INF);
root->rs=u,u->fa=root;
root->siz=2,root->fa=null;
}
data1 *insert(int val)
{
data1 *u=pre(root,val,null);
splay(u,null);
data1 *v=nxt(root,val,null);
splay(v,u);
if(v->ls!=null)v->ls->cnt++,v->ls->siz++;
else v->ls=new_node(val),v->ls->fa=v;
push_up(v),push_up(u);
return v->ls;
}
int remove(int val)
{
data1 *u=nxt(root,val-1,null);
splay(u,null);
int res=u->ls->siz-1;
u->ls=node+2,u->ls->fa=u;
push_up(u);
return res;
}
data1 *find(data1 *u,int k)
{
int rsiz=0,cnt=u->cnt;
if(u->rs!=null)rsiz=u->rs->siz;
if(k<=rsiz)return find(u->rs,k);
if(k<=rsiz+cnt)return u;
return find(u->ls,k-rsiz-cnt);
}
int get_find(int k){return find(root,k)->val;}
void updata(int val){updata(root,val);}
int get_siz(){return root->siz;}
}tree;
char op;
int n,minn,k;
int ans;
signed main()
{
ios::sync_with_stdio(false);
cin.tie(0),cout.tie(0);
tree.init();
cin>>n>>minn;
for(int i=1;i<=n;i++)
{
cin>>op>>k;
if(op=='I')data1 *tmp=tree.insert(k);
if(op=='A')tree.updata(k);
if(op=='S')tree.updata(-k);
if(op=='F')
{
int siz=tree.get_siz();
if(k>=siz-1)cout<<"-1\n";
else cout<<tree.get_find(k+1)<<'\n';
}
ans+=tree.remove(minn);
}
cout<<ans;
return 0;
}