FHQ treap,样例通过,显示RE
#include <bits/stdc++.h>
using namespace std;
const int M = 1e6 + 10;
int cnt = 0,root = 0;
struct node{
int ls,rs;
int key,pri;
int size;
}t[M];
void newnode(int x){
cnt ++;
t[cnt].size = 1;
t[cnt].ls = t[cnt].rs = 0;
t[cnt].key = x;
t[cnt].pri = rand();
}
void update(int u){
t[u].size = t[t[u].ls].size + t[t[u].rs].size + 1;
}
void split(int u,int x,int &L,int &R){
if(!u){
L = R = 0;
return;
}
if(t[u].key <= x){
L = u;
split(t[u].rs,x,t[u].rs,R);
}
if(t[u].key > x){
R = u;
split(t[u].ls,x,L,t[u].ls);
}
update(u);
}
int merge(int l,int r){
if(l == 0 || r == 0) return l + r;
if(t[l].pri > t[r].pri){
t[l].rs = merge(t[l].rs,r);
update(l);
return l;
}else{
t[r].ls = merge(l,t[r].ls);
update(r);
return r;
}
}
int insert(int x){
int l,r;
split(root,x,l,r);
newnode(x);
int A = merge(l,cnt);
root = merge(A,r);
}
int del(int x){
int l,r,p;
split(root,x,l,r);
split(l,x - 1,l,p);
p = merge(t[p].ls,t[p].rs);
root = merge(merge(l,p),r);
}
void Rank(int x){
int l,r;
split(root,x - 1,l,r);
cout << t[l].size + 1 << "\n";
root = merge(l,r);
}
int kth(int u,int k){
if(k <= t[t[u].ls].size) return kth(t[u].ls,k);
if(k == t[t[u].ls].size + 1) return u;
if(k > t[t[u].ls].size) return kth(t[u].rs,k - t[t[u].ls].size - 1);
}
void precursor(int x){
int l,r;
split(root,x - 1,l,r);
cout << t[kth(l,t[l].size)].key << "\n";
root = merge(l,r);
}
void successor(int x){
int l,r;
split(root,x,l,r);
cout << t[kth(r,1)].key << "\n";
root = merge(l,r);
}
int main(){
int n;
cin >> n;
while(n --){
int op,x;
cin >> op >> x;
if(op == 1) insert(x);
if(op == 2) del(x);
if(op == 3) Rank(x);
if(op == 4) cout << t[kth(root,x)].key << "\n";
if(op == 5) precursor(x);
if(op == 6) successor(x);
}
return 0;
}