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;
FHQ_Treap平衡树模板
猜你喜欢
转载自blog.csdn.net/Game_Acm/article/details/81316393
今日推荐
周排行