初学Treap,30pts显示MLE
#include<bits/stdc++.h>
using namespace std;
const int N=100010;
struct node{
int ls,rs,size,w,pri;
};
node t[N];
int T,cnt;
void build(int x){
int u=++cnt;
t[u].w=x;t[u].ls=t[u].rs=0;t[u].size=1;t[u].pri=rand();
}
void up(int u){
t[u].size=t[t[u].ls].size+t[t[u].rs].size+1;
}
void leftr(int &u){ //left round
int k;
k=t[u].rs;
t[u].rs=t[k].ls;
t[k].ls=u;
t[k].size=t[u].size;
up(u);
u=k;
}
void rightr(int &u){ //right round
int k;
k=t[u].ls;
t[u].ls=t[k].rs;
t[k].rs=u;
t[k].size=t[u].size;
up(u);
u=k;
}
void insert(int &u,int x){
if(u==0){
build(x);u=cnt;return;
}
t[u].size++;
if(x>=t[u].w) insert(t[u].rs,x);
else insert(t[u].ls,x);
if(t[u].ls!=0&&t[u].pri>t[t[u].ls].pri) rightr(u);
if(t[u].rs!=0&&t[u].pri>t[t[u].rs].pri) leftr(u);
}
void del(int &u,int x){
t[u].size--;
if(t[u].w==x){
u=0;
if(t[u].ls==0&&t[u].rs==0) return;
if(t[u].ls==0||t[u].rs==0){
u=t[u].ls+t[u].rs;
return;
}
if(t[t[u].ls].pri<t[t[u].rs].pri){
rightr(u);
del(t[u].rs,x);
return;
}
else{
leftr(u);
del(t[u].ls,x);
return;
}
}
if(t[u].w<x) del(t[u].ls,x);
else del(t[u].rs,x);
up(u);
}
int rank1(int u,int x){
if(u==0) return 0;
if(x>t[u].w) return (t[t[u].ls].size+1+rank1(t[u].rs,x));
else return rank1(t[u].ls,x);
}
int ask(int u,int k){
//cout<<u<<endl;
if(k==t[t[u].ls].size+1) return t[u].w;
if(k>t[t[u].ls].size+1) return ask(t[u].rs,k-(t[t[u].ls].size+1));
else return ask(t[u].ls,k);
}
int front(int u,int x){
if(u==0) return 0;
if(t[u].w>=x){
return front(t[u].ls,x);
}
int tmp=max(t[u].w,front(t[u].rs,x));
return tmp;
}
int back(int u,int x){
if(u==0) return INT_MAX;
if(t[u].w<=x){
return back(t[u].rs,x);
}
int tmp=min(t[u].w,back(t[u].ls,x));
return tmp;
}
int main(){
cin>>T;
int root=0;
while(T--){
int opt,x;
cin>>opt>>x;
//cout<<"root"<<root<<endl;
switch (opt){
case 1 : insert(root,x); break;
case 2 : del(root,x); break;
case 3 : {
cout<<rank1(root,x)+1<<endl;
break;
}
case 4 : {
cout<<ask(root,x)<<endl;
break;
}
case 5 : {
cout<<front(root,x)<<endl;
break;
}
case 6 : {
cout<<back(root,x)<<endl;
break;
}
}
}
return 0;
}