真是一个玄学。
#include<bits/stdc++.h>
using namespace std;
const int N=3e5+5;
int n,m,root,idx,delta;
struct node{
int s[2],p,v,size;
void init(int tv,int tp){
v=tv;
p=tp;
size=1;
}
}tr[N];
void pushup(int x){
tr[x].size=tr[tr[x].s[0]].size+tr[tr[x].s[1]].size+1;
}
void rotate(int x){
int y=tr[x].p,z=tr[y].p;
int k=tr[y].s[1]==x;
tr[z].s[tr[z].s[1]==y]=x,tr[x].p=z;
tr[y].s[k]=tr[x].s[k^1],tr[tr[x].s[k^1]].p=y;
tr[x].s[k^1]=y,tr[y].p=x;
pushup(y);
pushup(x);
}
void splay(int x,int k){
while(tr[x].p!=k){
int y=tr[x].p,z=tr[y].p;
if(z!=k){
if((tr[y].s[1]==x)^(tr[z].s[1]==y))rotate(x);
else rotate(y);
}
rotate(x);
}
if(!k)root=x;
}
int insert(int v){
int u=root,p=0;
while(u)p=u,u=tr[u].s[v>tr[u].v];
u=++idx;
if(p)tr[p].s[v>tr[p].v]=u;
tr[u].init(v,p);
splay(u,0);
return u;
}
int get_k(int k){
int u=root;
while(1){
if(tr[tr[u].s[0]].size>=k)u=tr[u].s[0];
else if(tr[tr[u].s[0]].size+1==k)return tr[u].v;
else k-=tr[tr[u].s[0]].size+1,u=tr[u].s[1];
}
return -1;
}
int get(int v){
int u=root,res;
while(u){
if(tr[u].v>=v)res=u,u=tr[u].s[0];
else u=tr[u].s[1];
}
return res;
}
int main(){
// ios::sync_with_stdio(false);
// cin.tie(0);
// cout.tie(0);
cin>>n>>m;
int L=insert(-1e9),R=insert(1e9),tot=0;
while(n--){
char op[10];
int k;
cin>>op[0]>>k;
if(op[0]=='I')if(k>=m)/*cout<<"#",*/k-=delta,insert(k),tot++;
else if(op[0]=='A')/*cout<<"$",*/k+=delta;
else if(op[0]=='S'){
// cout<<"^";
delta-=k;
R=get(m-delta);
splay(R,0);
splay(L,R);
tr[L].s[1]=0;
pushup(L);
pushup(R);
}else{
// cout<<"&";
if(tr[root].size-2<k)cout<<"-1"<<endl;
else cout<<get_k(tr[root].size-k)+delta<<endl;
}
}
cout<<tot-(tr[root].size+2)<<endl;
return 0;
}