FHQ Treap模板

#include <bits/stdc++.h>
#define MAXN 500005
using namespace std;
inline int read() {
    int x=0,f=1;
    char ch=getchar();
    while (ch<'0'||ch>'9') {
        if (ch=='-') f=-1;
        ch=getchar();
    }
    while (ch>='0'&&ch<='9') {
        x=(x*10)+(ch-'0');
        ch=getchar();
    }
    return x*f;
}
namespace FHQ_Treap{
	struct node{
		int l,r;
		int val;//每个点的权值 
		int pri;//优先级(随机生成)
		int sz; 
	}tree[MAXN];
	int tot;
	#define lc(i) tree[i].l
	#define rc(i) tree[i].r
	inline void Update(int x){
		tree[x].sz=tree[lc(x)].sz+tree[rc(x)].sz+1;
	}
	inline int New(int v){
		tree[++tot].val=v;
		tree[tot].pri=rand();
		tree[tot].sz=1;
		return tot;
	}
	int Merge(int x,int y){
		if (!x||!y) return x+y;
		if (tree[x].pri<tree[y].pri){
			rc(x)=Merge(rc(x),y),Update(x);
			return x;
		}
		else {
			lc(y)=Merge(x,lc(y)),Update(y);
			return y;
		}
	}
	void Split(int i,int k,int &x,int &y){
		if (!i){//叶节点
			x=y=0;
		}
		else {
			if (tree[i].val<=k){x=i,Split(rc(i),k,rc(i),y);}
			else{y=i,Split(lc(i),k,x,lc(i));}
			Update(i);
		}
	}
	int kth(int i,int k){//排名为k
		while (true){
			if (k<=tree[lc(i)].sz){
				i=lc(i);
			}
			else if (k==tree[lc(i)].sz+1){
				return i;
			}
			else{
				k-=tree[lc(i)].sz+1;
				i=rc(i);
			}
		}
	}
    //以上为FHQ Treap
    int root,x,y,z;
    void Init(){
        tot=0;
        memset(tree,0,sizeof(tree));
        root=0;
        srand(19260817);
    }
    inline void Add(int num){
		Split(root,num,x,y);
		root=Merge(Merge(x,New(num)),y);
    }
    inline void Del(int num){
		Split(root,num,x,z);
		Split(x,num-1,x,y);
		y=Merge(lc(y),rc(y));
		root=Merge(Merge(x,y),z);
    }
    inline int Rank(int num){//获得num排名
        Split(root,num-1,x,y);
        int temp=tree[x].sz+1;
		root=Merge(x,y);
        return temp;
    }
	#define Get_K(rt,rk) tree[kth(rt,rk)].val
    inline int Kth(int k){//获得数组中第k大
		return Get_K(root,k);
    }
    inline int Pre(int num){
        Split(root,num-1,x,y);
		int temp=Get_K(x,tree[x].sz);
		root=Merge(x,y);
        return temp;
    }
    inline int Nex(int num){
        Split(root,num,x,y);
		int temp=Get_K(y,1);
		root=Merge(x,y);
        return temp;
    }
};
using namespace FHQ_Treap;
#define INF 0x3f3f3f3f
int main(){
    Init();
    int n=read();
    Add(INF),Add(-INF);
    
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值