平衡树

int merge(int p1,int p2){//合并两棵treap 
    if(!p1)return p2;
    if(!p2)return p1;
    if(z[p1].key<z[p2].key){
        z[p1].r=merge(z[p1].r,p2);
        return p1;
    }
    else{
        z[p2].l=merge(p1,z[p2].l);
        return p2;
    }
}

pair<int,int>split(int p,int k){//把p拆成两棵树,一棵大小为k,另一棵为n-k 
    if(z[z[p].l].size>=k){
        if(!z[p].l)return make_pair(0,p);
        else{
            pair<int,int>px=split(z[p].l,k);
            int pl=px.first;
            z[p].l=px.second;
            return make_pair(pl,p);
        }
    }
    else{
        if(z[p].r==0)return make_pair(p,0);
        else{
            pair<int,int>px=split(z[p].r,k-z[z[p].l].size-1);
            z[p].r=px.first;
            int pr=px.second;
            return make_pair(p,pr);
        }
    }
}

int query_min(int p,int v){
    int ans=0;
    while(p){
        if(z[p].v>=v)p=z[p].l;
        else ans+=z[z[p].l].size+1,p=z[p].r;
    }
    return ans;
}

int Insert(int p,int v){
    int k=query_min(p,v);
    pair<int,int>px=split(p,k);
    int p1=px.first;
    int p2=nownode;
    update(p2);
    int p3=px.second;
    z[p2].v=v;
    return merge(merge(p1,p2),p3);
}

 

posted @ 2017-10-29 21:38  Echo宝贝儿  阅读(147)  评论(0编辑  收藏  举报