treap模版

#include<cstdio>
#include<cstring>
#include<iostream>
#include<cstdlib>
using namespace std;
const int MAX=0x7fffffff;
const int MIN=-19999999;
struct node{
    int key,pri,siz,cnt;
    node *ch[2];
    node(){}
    node(int x,int y,int z,int w){
        key=x;pri=y;siz=z;cnt=w;
    }
    void rs(){siz=ch[0]->siz+ch[1]->siz+cnt;}
};
typedef node *pnode;
pnode null,root;
/*
d=1:Zag
d=0:Zig
*/
void rotate(pnode &t,bool d){
    pnode tmp=t->ch[d];t->ch[d]=tmp->ch[!d];tmp->ch[!d]=t;
    tmp->siz=t->siz;
    t->rs();
    t=tmp;
}
void ins(pnode &t,int key){
    if(t==null){
        t=new struct node(key,rand(),1,1);
        t->ch[0]=t->ch[1]=null;
    }
    else if(key==t->key)t->cnt++;
    else{
        bool d=key > t->key;
        ins(t->ch[d],key);
        if(t->ch[d]->pri < t->pri)rotate(t,d);
    }
    t->rs();
}
void del(pnode &t,int key){
    if(t==null)return;
    else if(key==t->key){
        if(t->cnt>1)t->cnt--;
        else if(t->ch[0]==null && t->ch[1]==null){
            delete t;t=null;
        }
        else if(t->ch[0]==null)t=t->ch[1];
        else if(t->ch[1]==null)t=t->ch[0];
        else{
            rotate(t,t->ch[0]->pri > t->ch[1]->pri);
            del(t,key);
        }
    }else del(t->ch[key > t->key],key);
    t->rs();
}
void order(pnode t){
    if(t==null)return;
    order(t->ch[0]);
    for(int i=1;i<=t->cnt;i++)printf("%d ",t->key);
    order(t->ch[1]);
}
int quer_no(pnode t,int key){
    if(t==null)return 0;
    if(t->key==key)return t->ch[0]->siz+1;
    if(t->key > key)return quer_no(t->ch[0],key);
    return t->ch[0]->siz+t->cnt+quer_no(t->ch[1],key);
}
int find_k(pnode t,int k){
    if(t->siz < k)return 0;
    if(t->ch[0]->siz<k&&t->cnt+t->ch[0]->siz>=k)return t->key;
    if(t->ch[0]->siz>=k)return find_k(t->ch[0],k);
    return find_k(t->ch[1],k-t->ch[0]->siz-t->cnt);
}
int pred(pnode t,int key){
    if(t==null)return MIN;
    if(key<=t->key)return pred(t->ch[0],key);
    return max(t->key,pred(t->ch[1],key));
}
int succ(pnode t,int key){
    if(t==null)return MAX;
    if(key>=t->key)return succ(t->ch[1],key);
    return min(t->key,succ(t->ch[0],key));
}
int main(){
     
    /*init*/
    null=new struct node(0,MAX,0,0);
    null->ch[0]=null->ch[1]=null;
    root=null;
    srand(121);
     
    int fg,x,n;
    scanf("%d",&n);
    while(n--){
        scanf("%d%d",&fg,&x);
        switch(fg){
            case 1:
                ins(root,x);
                break;
            case 2:
                del(root,x);
                break;
            case 3:
                printf("%d\n",quer_no(root,x));
                break;
            case 4:
                printf("%d\n",find_k(root,x));
                break;
            case 5:
                printf("%d\n",pred(root,x));
                break;
            case 6:
                printf("%d\n",succ(root,x));
                break;
        }
    }

你可能感兴趣的:(模版,treap)