传送门:
http://www.lydsy.com/JudgeOnline/problem.php?id=3224
Code:
#include<cstdio>
#include<cstdlib>
#include<climits>
#include<iostream>
#include<algorithm>
using namespace std;
const int INF=INT_MAX;
int KEY=12345678;
int rnd(){
return KEY+=KEY<<2|1;
}
typedef pair<int,int> pii;
struct Treap{
struct node{
int val;int key,size,s;
node *c[2];
node(int _val,node *C){
val=_val;key=rand();
size=1;s=1;
c[0]=c[1]=C;
}
void rz(){
size=c[0]->size+c[1]->size+s;
}
};
node *root,*Null;
Treap(){
Null=new node(0,0);
Null->size=0;Null->key=INF;Null->val=0;
Null->c[0]=Null->c[1]=Null;
root=Null;
}
void rot(node *&t,bool d){
node *p=t->c[d];
t->c[d]=p->c[!d];
p->c[!d]=t;
t->rz();p->rz();
t=p;
}
void _insert(node *&t,int x){
if(t==Null){
t=new node(x,Null);
return ;
}
if(t->val==x){
t->s++;
t->size++;
return;
}
bool d=x>t->val;
_insert(t->c[d],x);
if(t->c[d]->key<t->key)
rot(t,d);
else
t->rz();
}
void _Delete(node *&t,int x){
if(t==Null)return;
if(t->val==x){
if(t->s>1){
t->s--;
t->size--;
return;
}
bool d=t->c[1]->key<t->c[0]->key;
if(t->c[d]==Null){
delete t;
t=Null;
return ;
}
rot(t,d);
_Delete(t->c[!d],x);
}else{
bool d=x>t->val;
_Delete(t->c[d],x);
}
t->rz();
}
int _kth(node *&t,int x){
int r=t->c[0]->size;
if(t==Null)return 0;
else if(x<=r)return _kth(t->c[0],x);
else if(x>r+t->s)return _kth(t->c[1],x-r-t->s);
else return t->val;
}
int _rank(node *&t,int x){
int r=t->c[0]->size;
if(t==Null)return 0;
else if(x==t->val)return r+1;
else if(x>t->val)return r+t->s+_rank(t->c[1],x);
else return _rank(t->c[0],x);
}
void _deb(node *&t){
printf("val:%d L:%d R:%d\n",t->val,t->c[0]->val,t->c[1]->val);
//printf("key:%d L:%d R:%d\n",t->key,t->c[0]->key,t->c[1]->key);
printf("size:%d L:%d R:%d\n",t->size,t->c[0]->size,t->c[1]->size);
if(t->c[0]!=Null)_deb(t->c[0]);
if(t->c[1]!=Null)_deb(t->c[1]);
}
void deb(){_deb(root);puts("");}
void insert(int x){_insert(root,x);}
void del(int x){_Delete(root,x);}
int kth(int x){return _kth(root,x);}
int rank(int x){return _rank(root,x);}
int size(){return root->size;}
int _prev(node *&t,int x){
if(t==Null)return INT_MIN;
if(x<=t->val)return _prev(t->c[0],x);
return max(t->val,_prev(t->c[1],x));
}
int _next(node *&t,int x){
if(t==Null)return INT_MAX;
if(x>=t->val)return _next(t->c[1],x);
return min(t->val,_next(t->c[0],x));
}
int prev(int x){
return _prev(root,x);
}
int next(int x){
return _next(root,x);
}
}T;
int main(){
// freopen("1.txt","r",stdin);
// freopen("3.txt","w",stdout);
srand(12121);
int n,m;
scanf("%d",&n);m=n;
while(n--){
int opt,x;
scanf("%d",&opt);
switch(opt){
case 1:
scanf("%d",&x);
T.insert(x);
break;
case 2:
scanf("%d",&x);
T.del(x);
break;
case 3:
scanf("%d",&x);
printf("%d\n",T.rank(x));
break;
case 4:
scanf("%d",&x);
printf("%d\n",T.kth(x));
break;
case 5:
scanf("%d",&x);
printf("%d\n",T.prev(x));
break;
case 6:
scanf("%d",&x);
printf("%d\n",T.next(x));
break;
}
//T.deb();
}
return 0;
}