#include<bits/stdc++.h>
#define inf 0x3f3f3f3f
const int maxn=10000;
using namespace std;
struct node{
node* left;
node* right;
int value,fix,s,cnt;
node(int _value,int _fix,int _s,int _cnt):value(_value),fix(_fix),s(_s),cnt(_cnt){}
int lsize(){
if(left){
return left->s;
} else {
return 0;
}
}
int rsize(){
if(right){
return right->s;
} else{
return 0;
}
}
void M(){
s=cnt;
s+=lsize()+rsize();
}
};
void left_rotate(node* &a){
node* b=a->right;
a->right=b->left;
b->left=a;
a->M();
b->M();
a=b;
}
void right_rotate(node* &a){
node* b=a->left;
a->left=b->right;
b->right=a;
a->M();
b->M();
a=b;
}
void treap_insert(node* &P,int value){
if(!P){
P=new node(value,rand(),1,1);
} else{
if(P->value==value){
P->cnt++;
}
if(P->value>value){
treap_insert(P->left,value);
} else {
treap_insert(P->right,value);
}
if(P->fix>P->left->fix){
right_rotate(P);
} else if(P->fix>P->right->fix){
left_rotate(P);
}
}
P->M();
}
void treap_delete(node* &P,int value){
if(P->value==value){
if(P->cnt==1){
if(!P->left||!P->right){
node* t=P;
if(P->left)
P=P->left;
else if(P->right){
P=P->right;
} else {
P=NULL;
}
delete t;
} else {
if(P->left->fix<P->right->fix){
right_rotate(P);
treap_delete(P->right,value);
} else {
left_rotate(P);
treap_delete(P->left,value);
}
}
} else{
P->cnt--;
}
} else {
if(P->value>value){
treap_delete(P->left,value);
} else {
treap_delete(P->right,value);
}
}
if(P){
P->M();
}
}
int treap_find(node* P,int value){
if(P->value==value){
return 1;
} else {
if(P->value>value){
if(P->left)
treap_find(P->left,value);
} else {
if(P->right)
treap_find(P->right,value);
}
}
return 0;
}
int treap_kth(node* &P,int k){
int Lsize=P->lsize();
if(k<Lsize+1){
return treap_kth(P->left,k);
} else if(k>Lsize+P->cnt){
return treap_kth(P->right,k-Lsize-P->cnt);
} else {
return P->value;
}
}
int treap_rank(node* &P,int value,int cur){
int Lsize=P->lsize();
if(value==P->value){
return cur+Lsize+1;
} else if(value<P->value){
return treap_rank(P->left,value,cur);
} else {
return treap_rank(P->right,value,cur+Lsize+P->cnt);
}
}
node* tpred(node* &P,int value,node* &best){
if(!P){
return best;
} else {
if(P->value<value){
return tpred(P->right,value,P);
} else{
return tpred(P->left,value,best);
}
}
}
node* tsuc(node* &P,int value,node* &best){
if(!P){
return best;
} else {
if(P->value>value){
return tsuc(P->left,value,P);
} else {
return tsuc(P->right,value,best);
}
}
}
int main()
{
srand(time(0));
return 0;
}