每个数字的值是tr[k].num+delta
#include<iostream> #include<cstdlib> #include<cstdio> #include<ctime> using namespace std; struct data{ int l,r,num,rnd,s; }tr[100001]; int n,Min,root,size,leave,delta,X; char oper[1]; void update(int k){ tr[k].s=tr[tr[k].l].s+tr[tr[k].r].s+1; } void rrotate(int &k){ int t=tr[k].l; tr[k].l=tr[t].r; tr[t].r=k; tr[t].s=tr[k].s; update(k); k=t; } void lrotate(int &k){ int t=tr[k].r; tr[k].r=tr[t].l; tr[t].l=k; tr[t].s=tr[k].s; update(k); k=t; } void insert(int &k,int x){ if(k==0){ tr[k=++size].rnd=rand(); tr[k].num=x;tr[k].s=1; return; } tr[k].s++; if(x<tr[k].num){ insert(tr[k].l,x); if(tr[tr[k].l].rnd<tr[k].rnd)rrotate(k); } else{ insert(tr[k].r,x); if(tr[tr[k].r].rnd<tr[k].rnd)lrotate(k); } } int del(int &k,int x){ int t; if(k==0)return 0; if(tr[k].num<x){ t=tr[tr[k].l].s+1; k=tr[k].r; return t+del(k,x); } else{ t=del(tr[k].l,x); tr[k].s-=t; return t; } } int find(int k,int x) { if(tr[tr[k].l].s+1==x)return tr[k].num+delta; else if(tr[tr[k].l].s+1<x)return find(tr[k].r,x-tr[tr[k].l].s-1); else return find(tr[k].l,x); } int main(){ //srand(time(0)); scanf("%d%d",&n,&Min); while(n--){ scanf("%s%d",oper,&X); switch(oper[0]){ case 'I':{ if(X>=Min)insert(root,X-delta); break; } case 'A':{ delta+=X; break; } case 'S':{ delta-=X; leave+=del(root,Min-delta); break; } case 'F':{ if(X>tr[root].s)printf("-1\n"); else printf("%d\n",find(root,tr[root].s-X+1)); break; } } } printf("%d\n",leave); return 0; }