大部分 RE,还有三个 TLE,求调/kel。
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int inf=1e14;
int n,m;
int res;
int ans;
struct node{
int val;
int r;
int siz;
int num;
}tree[1000005];
int cnt;
int son[1000005][2];
int R;
inline void update(int p){
tree[p].siz=tree[p].num+tree[son[p][0]].siz+tree[son[p][1]].siz;
}
inline void spin(int &p,int op){
int v=son[p][op^1];
son[p][op^1]=son[v][op];
son[v][op]=p;
update(p);
update(v);
p=v;
}
inline void insert(int &p,int x){
if (!p){
p=++cnt;
tree[p].val=x;
tree[p].siz=1;
tree[p].num=1;
tree[p].r=rand();
}
else if (tree[p].val==x){
tree[p].num++;
}
else if (tree[p].val<x){
insert(son[p][1],x);
if (tree[p].r<tree[son[p][1]].r){
spin(p,0);
}
}
else{
insert(son[p][0],x);
if (tree[p].r<tree[son[p][1]].r){
spin(p,1);
}
}
update(p);
}
inline int del(int &p,int x){
if (!p){
return -1;
}
if (tree[p].val<x){
del(son[p][1],x);
}
else if (tree[p].val>x){
del(son[p][0],x);
}
else{
if (!son[p][1] && !son[p][0]){
res-=tree[p].num;
tree[p].num=0;
tree[p].siz=0;
p=0;
}
else if (!son[p][1] && son[p][0]){
spin(p,1);
del(son[p][1],x);
}
else if (son[p][1] && !son[p][0]){
spin(p,0);
del(son[p][0],x);
}
else{
if (tree[son[p][0]].r<tree[son[p][1]].r){
spin(p,1);
del(son[p][1],x);
}
else{
spin(p,0);
del(son[p][0],x);
}
}
}
update(p);
}
inline int fro(int p,int x){
if (!p){
return -inf;
}
int ans=-inf;
while (p){
if (tree[p].val<x){
ans=max(tree[p].val,ans);
p=son[p][1];
}
else{
p=son[p][0];
}
}
return ans;
}
inline int find(int p,int x){
if (!p){
return -inf;
}
if (tree[son[p][0]].siz>=x){
return find(son[p][0],x);
}
else if (tree[son[p][0]].siz+tree[p].num<x){
return find(son[p][1],x-tree[p].num-tree[son[p][0]].siz);
}
else{
return tree[p].val;
}
}
signed main(){
cin>>n>>m;
insert(R,-inf);
insert(R,inf);
int cg=0;
while (n--){
char op;
int k;
cin>>op>>k;
if (op=='I'){
if (k-cg>=m){
insert(R,k-cg);
res++;
ans++;
}
}
else if (op=='A'){
m-=k;
cg+=k;
}
else if (op=='S'){
m+=k;
cg-=k;
while (fro(R,m)!=-inf){
int id=fro(R,m);
del(R,id);
}
}
else{
if (res<k){
cout<<"-1\n";
}
else{
cout<<find(R,res-k+2)+cg<<endl;
}
}
}
cout<<ans-res;
return 0;
}