```cpp
#include <bits/stdc++.h>
#define rep(i,a,b) for(int i=a;i<=b;++i)
#define ls(rt) T[rt].lc
#define rs(rt) T[rt].rc
using namespace std;
const int N=1e5+5;
const int INF=0x3f3f3f3f;
struct node{
int val,rnk,lc,rc,sz;
}T[N];
int n,minn,tot=0,tag=0,ans=0;
int add(int val){
T[++tot].val=val;
ls(tot)=rs(tot)=0;
T[tot].sz=1;
T[tot].rnk=rand();
return tot;
}
void update(int rt){T[rt].sz=T[ls(rt)].sz+T[rs(rt)].sz+1;}
void split(int rt,int &a,int &b,int val){
if(!rt){
a=b=0;
return;
}
if(T[rt].val<=val){
a=rt;
split(rs(rt),rs(a),b,val);
} else {
b=rt;
split(ls(rt),a,ls(b),val);
}
update(rt);
}
void merge(int &rt,int a,int b){
if(a==0||b==0){
rt=a+b;
return;
}
if(T[a].rnk<T[b].rnk){
rt=a;
merge(rs(rt),rs(a),b);
} else {
rt=b;
merge(ls(rt),a,ls(b));
}
update(rt);
}
int kth(int rt,int k){
while(T[ls(rt)].sz+1!=k){
if(k<T[ls(rt)].sz+1)rt=ls(rt);
else rt=rs(rt),k-=T[ls(rt)].sz+1;
}
return T[rt].val;
}
void insert(int &rt,int val){
int x=0,y=0,newnode=add(val);
split(rt,x,y,val);
merge(x,x,newnode);
merge(rt,x,y);
}
void delk(int &rt,int val){
int x=0,y=0;
split(rt,x,y,val-1);
rt=y;
ans+=T[x].sz;
//printf("debug:T[x].sz = %d\n",T[x].sz);
}
int main(){
int root=0;
srand(19260817);
insert(root,INF);
scanf("%d%d",&n,&minn);
char cmd[5];
int kkk;
rep(i,1,n){
scanf("%s%d",cmd,&kkk);
if(cmd[0]=='I'){
if(kkk>=minn){
insert(root,kkk-tag);
}
}
if(cmd[0]=='A')tag+=kkk;
if(cmd[0]=='S'){
tag-=kkk;
delk(root,minn-tag);
}
if(cmd[0]=='F'){
if(kkk<=T[root].sz-1)printf("%d\n",kth(root,T[root].sz-kkk)+tag);
else printf("-1\n");
}
}
printf("%d",ans);
return 0;
}
```
by henrytb @ 2019-08-08 20:19:38