rt 代码:
#include<bits/stdc++.h>
using namespace std;
#define rank Rank
const int M=1e5+10;
int cnt=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 upd(int u) {
t[u].size=t[t[u].ls].size+t[t[u].rs].size+1;
}
void rotate(int &o, bool d) { // d=1right d=0left
int k;
if(!d) {
k=t[o].rs;
t[o].rs=t[k].ls;
t[k].ls=o;
}
else {
k=t[o].ls;
t[o].ls=t[k].rs;
t[k].rs=o;
}
t[k].size=t[o].size;
upd(o);
o=k;
}
void ins(int &u, int x) {
if(u==0) {newnode(x); u=cnt; return;}
++t[u].size;
if(x<t[u].key) ins(t[u].ls, x);
else ins(t[u].rs, x);
if(t[u].ls&&t[t[u].ls].pri>t[u].pri) rotate(u, 1);
if(t[u].rs&&t[t[u].rs].pri>t[u].pri) rotate(u, 0);
upd(u);
}
int rank(int u, int x) {
if(u==0) return 0;
if(x>t[u].key) return t[t[u].ls].size+1+Rank(t[u].rs, x);
return Rank(t[u].ls,x);
}
int th(int u, int x) {
if(x==t[t[u].ls].size+1) return t[u].key;
if(x<=t[t[u].ls].size) return th(t[u].ls, x);
if(x>t[t[u].ls].size+1) return th(t[u].rs, x-t[t[u].ls].size-1);
}
int lowerb(int u, int x) {
if(u==0) return -2147483648;
if(x<t[u].key) return lowerb(t[u].ls, x);
int tmp=lowerb(t[u].rs, x);
if(tmp!=-2147483648) return tmp;
return t[u].key;
}
int upperb(int u, int x) {
if(u==0) return -2147483648;
if(x>t[u].key) return upperb(t[u].rs, x);
int tmp=upperb(t[u].ls, x);
if(tmp!=-2147483648) return tmp;
return t[u].key;
}
void del(int &u, int x) {
--t[u].size;
if(t[u].key==x) {
if(!(t[u].ls||t[u].rs)) u=0;
else if(t[u].ls^t[u].rs) u=t[u].ls+t[u].rs;
else
if(t[t[u].ls].pri>t[t[u].rs].pri) {
rotate(u, 0);
del(t[u].ls, x);
}
else {
rotate(u, 1);
del(t[u].rs, x);
}
return;
}
if(t[u].key>x) del(t[u].ls, x);
else del(t[u].rs, x);
upd(u);
}
void sor(int u) {
if(u==0) return;
sor(t[u].ls);
cout << t[u].key << " "; // << t[u].size << endl;
sor(t[u].rs);
}
int main() {
int n, root=0;
cin >> n;
for(int i=0; i<n; i++) {
int opt, x;
cin >> opt;
switch(opt) {
case 1: cin >> x; ins(root, x); break;
case 2: cin >> x; del(root, x); break;
case 3: cin >> x; cout << rank(root, x)+1 << endl; break;
case 4: cin >> x; cout << th(root, x) << endl; break;
case 5: cin >> x; cout << lowerb(root, x) << endl; break;
case 6: cin >> x; cout << upperb(root, x) << endl; break;
case 10: sor(root); cout << endl; break;
}
}
return 0;
}