样例都没过啊!!!
#include <bits/stdc++.h>
using namespace std;
struct node{
int ls , rs , tsize , fsize , f , date;
};
int T;
int root , pool , poi , cnt , to_rebuild;
double alpha = 0.75;
int memo[400040] , c[400040];
node a[400040];
bool cheak(int now){ //判断是否重构
if((double)a[now].fsize * alpha <= (double)max(a[a[now].ls].fsize , a[a[now].rs].fsize)) return true;
return false;
}
void dfs(int now){ //中序遍历
if(!now) return;
dfs(a[now].ls);
if(a[now].f) c[++poi] = now;
else memo[++pool] = now;
dfs(a[now].rs);
}
void build(int l , int r , int &now){ //建树
int mid = (l + r) / 2;
now = c[mid];
if(l == r){
a[now].ls = a[now].rs = 0;
a[now].fsize = a[now].tsize = 1;
return;
}
if(l < mid) build(l , mid - 1 , a[now].ls);
else a[now].ls = 0;
build(mid + 1 , r , a[now].rs);
a[now].tsize = a[a[now].ls].tsize + a[a[now].rs].tsize + 1;
a[now].fsize = a[a[now].ls].fsize + a[a[now].rs].fsize + 1;
}
void rebuild(int &now){ //重建
poi = 0;
dfs(now);
if(poi) build(1 , poi , now);
else now = 0;
}
void insert(int &now , int t){ //插入
if(!now){
now = memo[pool--] , a[now].date = t;
a[now].f = a[now].tsize = a[now].fsize = 1;
a[now].ls = a[now].rs = 0;
return;
}
a[now].tsize++ , a[now].fsize++;
if(a[now].date >= t) insert(a[now].ls , t);
else insert(a[now].rs , t);
if(!cheak(now)){
if(to_rebuild){
if(a[now].ls == to_rebuild) rebuild(a[now].ls);
else rebuild(a[now].rs);
to_rebuild = 0;
}
}else to_rebuild = now;
}
void delet(int &now , int rk){ //删除排名为rk的数
if(a[now].f && a[a[now].ls].fsize + 1 == rk){
a[now].f = 0;
a[now].fsize--;
return;
}
a[now].fsize--;
if(a[a[now].ls].fsize + a[now].f >= rk) delet(a[now].ls , rk);
else delet(a[now].rs , rk - a[a[now].ls].fsize - a[now].f);
}
int ft(int rk){ //超找排名为rk的数值为多少
int now = root;
while(now){
if(a[now].f && a[a[now].ls].fsize + 1 == rk) return a[now].date;
else if(a[a[now].ls].fsize >= rk) now = a[now].ls;
else{
rk -= a[a[now].ls].fsize + a[now].f;
now = a[now].rs;
}
}
}
int frk(int t){ //查找t的排位
int now = root , ans = 1;
while(now){
if(a[now].date >= t) now = a[now].ls;
else{
ans += a[a[now].ls].fsize + a[now].f;
now = a[now].rs;
}
}
return ans;
}
void rdelet(int t){ //删除值为t的数
delet(root , frk(t));
if((double)a[root].tsize * alpha > a[root].fsize) rebuild(root);
}
int main(){
cin >> T;
for(int i = 2000000; i >= 1; i--) memo[++pool] = i;
while(T--){
int opt , x;
cin >> opt >> x;
if(opt == 1) insert(root , x);
if(opt == 2) rdelet(x);
if(opt == 3) cout << frk(x) << endl;
if(opt == 4) cout << ft(x) << endl;
if(opt == 5) cout << ft(frk(x) - 1) << endl;
if(opt == 6) cout << ft(frk(x) + 1) << endl;
}
return 0;
}