```cpp
#include<bits/stdc++.h>
//#define int long long
using namespace std;
const int N=3e5+10;
int n,minx,ans;
struct node{
int l,r,key,val,size;
}tr[N<<1];
int root,idx;
int x,y,z;
void update(int p){
tr[p].size=tr[tr[p].l].size+tr[tr[p].r].size+1;
}
int get_node(int key){
tr[++idx].key=key;
tr[idx].val=rand();
tr[idx].size=1;
return idx;
}
void split(int p,int key,int &x,int &y){
if(!p)x=y=0;
else{
if(tr[p].key<=key){
x=p;
split(tr[p].r,key,tr[p].r,y);
}else{
y=p;
split(tr[p].l,key,x,tr[p].l);
}
update(p);
}
}
int merge(int x,int y){
if(!x||!y)return x+y;
if(tr[x].val>tr[y].val){
tr[x].r=merge(tr[x].r,y);
update(x);
return x;
}else{
tr[y].l=merge(x,tr[y].l);
update(y);
return y;
}
}
void insert(int key){
split(root,key,x,y);
root=merge(merge(x,get_node(key)),y);
}
void del(int key){
ans++;
split(root,key,x,z);
split(x,key-1,x,y);
y=merge(tr[y].l,tr[y].r);
root=merge(merge(x,y),z);
//update(root);
}
int get_prev(int key){
split(root,key-1,x,y);
int p=x;
if(!p){
return 0;
}
while(tr[p].r) p=tr[p].r;
key=tr[p].key;
root=merge(x,y);
return key;
}
int get_key(int rank){
int p=root;
while(p){
if(tr[tr[p].l].size+1==rank){
break;
}
else if(tr[tr[p].l].size>=rank)
p=tr[p].l;
else{
rank-=tr[tr[p].l].size+1;
p=tr[p].r;
}
}
return tr[p].key;
}
int main(){
srand(time(0));
int ex=0;
cin>>n>>minx;
char op;
for(int i=1,t;i<=n;i++){
cin>>op;
cin>>t;
if(op=='I'){
if(t+ex<minx)continue;
insert(t+ex);
}else if(op=='A'){
minx-=t;
ex-=t;
}else if(op=='S'){
minx+=t,ex+=t;
int temp=get_prev(minx);
while(temp){
del(temp);
temp=get_prev(minx);
}
}else if(op=='F'){
int temp=get_prev(minx);
while(temp){
del(temp);
temp=get_prev(minx);
}
if(t>tr[root].size){
cout<<-1<<endl;
}else{
update(root);cout<<get_key(tr[root].size-t+1)-ex<<endl;
}
}
}
cout<<ans;
}
```
我就#6wa了。。。。
by CyberPrisoner @ 2023-07-20 14:24:19