FHQ_Treap平衡树模板

struct FHQ_Treap
{
    struct fhq_treap
    {
        int l,r;
        int v,rnd;
        int sizes;
    }ftr[maxn];
    int sizes,root,tmp;
    void Init()
    {
        sizes = root = 0;
    }
    int Random()
    {
        static int seed = 703;
        return seed = (int)(seed*48271LL%2147483647);
    }
    void Update( int k )
    {
        if ( !k )
            return;
        ftr[k].sizes = ftr[ftr[k].l].sizes+ftr[ftr[k].r].sizes+1;
    }
    void Build( int &k , int x )
    {
        k = ++sizes;
        ftr[k].rnd = Random();
        ftr[k].v = x;
        ftr[k].sizes = 1;
        ftr[k].l = 0;
        ftr[k].r = 0;
    }
    void Merge( int &k , int l , int r )
    {
        if ( !l||!r )
            k = l+r;
        else if ( ftr[l].rnd<ftr[r].rnd )
            k = l,Merge( ftr[k].r , ftr[k].r , r ),Update( k );
        else
            k = r,Merge( ftr[k].l , l , ftr[k].l ),Update( k );
    }
    void Split( int k , int &l , int &r , int s )
    {
        if ( !s )
            l = 0,r = k;
        else if ( s==ftr[k].sizes )
            l = k,r = 0;
        else if ( s<=ftr[ftr[k].l].sizes )
            r = k,Split( ftr[k].l , l , ftr[k].l , s ),Update( k );
        else
            l = k,Split( ftr[k].r , ftr[k].r , r , s-ftr[ftr[k].l].sizes-1 ),Update( k );
    }
    int Rank( int k , int x )
    {
        if ( !k )
            return 0;
        if ( ftr[k].v>=x )
            return Rank( ftr[k].l , x );
        else
            return Rank( ftr[k].r , x )+ftr[ftr[k].l].sizes+1;
    }
    void Insert( int k )
    {
        int x,y,rk = Rank( root , k );
        Split( root , x , y , rk );
        Build( tmp , k );
        Merge( x , x , tmp );
        Merge( root , x , y );
    }
    void Delete( int k )
    {
        int x,y,z,rk = Rank( root , k )+1;
        Split( root , x , y , rk );
        Split( x , x , z , rk-1 );
        Merge( root , x , y );
    }
    int Find( int k )
    {
        int x,y,z,ans;
        Split( root , x , y , k );
        Split( x , z , x , k-1 );
        ans = ftr[x].v;
        Merge( x , z , x );
        Merge( root , x , y );
        return ans;
    }
    int Pre( int k )
    {
        int x,y,z,ans,rk = Rank( root , k );
        Split( root , x , y , rk );
        Split( x , z , x , rk-1 );
        ans = ftr[x].v;
        Merge( x , z , x );
        Merge( root , x , y );
        return ans;
    }
    int Suc( int k )
    {
        int x,y,z,ans,rk = Rank( root , k+1 );
        Split( root , x , y , rk+1 );
        Split( x , z , x , rk );
        ans = ftr[x].v;
        Merge( x , z , x );
        Merge( root , x , y );
        return ans;
    }
}fhq_treap;

猜你喜欢

转载自blog.csdn.net/Game_Acm/article/details/81316393