看脸Treap求条,玄关
查看原帖
看脸Treap求条,玄关
1060759
qw1234321楼主2024/2/29 10:57
#include<bits/stdc++.h>
#define int long long
#define il inline
using namespace std;

const int N = 100005;

struct Treap{
	int tot, root, INF = 0x3f3f3f3f;
	struct node{
		int l, r, ln, rn, sn;
		int fa, v, det, cnt;
	}t[N];
	il int create(int x){
		t[++tot].v = x;
		t[tot].sn = 1;
		t[tot].cnt = 1;
		t[tot].det = rand() * rand() % 10000000;
		return tot;
	} 
	il void up(int x){
		t[x].sn = t[t[x].l].sn + t[t[x].r].sn + t[x].cnt;
	}
	il void zig(int &p){
		int q = t[p].l;
		t[p].l = t[q].r;
		t[q].r = p;
		p = q;
		up(t[p].r);
		up(p);
	}
	il void zag(int &p){
		int q = t[p].r;
		t[p].r = t[q].l;
		t[q].l = p;
		p = q;
		up(t[p].l);
		up(p);
	}
	il void ins(int &p, int v){
		if (!p){
			p = create(v);
			return ;
		}
		if (v < t[p].v){
			ins(t[p].l, v);
			if (t[p].det < t[t[p].l].det) zig(p);
		}
		else{
			ins(t[p].r, v);
			if (t[p].det < t[t[p].r].det) zag(p);
		}
		up(p);
	}
	il void del(int &p, int v){
		if (!p) return ;
		if (v == t[p].v){
			if (t[p].cnt > 1){
				t[p].cnt--;
				up(p);
				return ;
			}
			if (!t[p].l && !t[p].r){
				p = 0;
				return ;
			}
			if (!t[p].r || t[t[p].l].det > t[t[p].r].det){
				zig(p);
				del(t[p].r, v);
			}
			else{
				zag(p);
				del(t[p].l, v);
			}
			up(p);
		}
		if (v < t[p].v) del(t[p].l, v);
		else del(t[p].r, v);
	}
	il int get_rank(int p, int v){
		if (!p) return 0;
		if (v == t[p].v) return t[t[p].l].sn + 1;
		if (v < t[p].v) return get_rank(t[p].l, v);
		return get_rank(t[p].r, v) + t[t[p].l].sn + t[p].cnt;
	}
	il int get_val(int p, int k){
		if (!p) return -1;
		if (t[t[p].l].sn >= k) return get_val(t[p].l, k);
		if (t[t[p].l].sn + t[p].cnt >= k) return t[p].v;
		return get_val(t[p].r, k - t[t[p].l].sn - t[p].cnt);
	}
	il int pre(int p, int v){
		if (!p) return 0;
		if (t[p].v >= v) return pre(t[p].l, v);
		int tmp = pre(t[p].r, v);
		if (!tmp) return t[p].v;
		return tmp;
	}
	il int nxt(int p, int v){
		if (!p) return 0;
		if (t[p].v <= v) return nxt(t[p].r, v);
		int tmp = nxt(t[p].l, v);
		if (!tmp) return t[p].v;
		return tmp;
	}
}trp;

signed main(){
	srand(time(0));
	int n, opt, x;
	cin >> n;
	for (int i = 1; i <= n; i++){
		cin >> opt >> x;
		if (opt == 1) trp.ins(trp.root, x);
		else if (opt == 2) trp.del(trp.root, x);
		else if (opt == 3){
			trp.ins(trp.root, x);
			cout << trp.get_rank(trp.root, x) << "\n";
			trp.del(trp.root, x);
		}
		else if (opt == 4) cout << trp.get_val(trp.root, x) << "\n";
		else if (opt == 5){
			trp.ins(trp.root, x);
			cout << trp.pre(trp.root, x) << "\n";
			trp.del(trp.root, x);
		}
		else if (opt == 6){
			trp.ins(trp.root, x);
			cout << trp.nxt(trp.root, x) << "\n";
			trp.del(trp.root, x);
		}
	}
	return 0;
}
2024/2/29 10:57
加载中...