FHQ Treap 28 pts 求调
查看原帖
FHQ Treap 28 pts 求调
434929
Usada_Pekora楼主2022/2/23 15:07
#include <bits/stdc++.h>
using namespace std;
const int N = 1e6 + 5;
int ls[N], rs[N], pri[N], val[N], size[N], cnt, rt;
inline void pushup(int p) {
	size[p] = size[ls[p]] + size[rs[p]] + 1; 
}
inline int build(int w) {
	val[++cnt] = w;
	size[cnt] = 1;
	pri[cnt] = rand();
	return cnt;
}
inline void split(int p, int w, int &x, int &y) {
	if(!p) {
		x = y = 0;
		return;
	} else if(w >= val[p]) {
		x = p;
		split(rs[p], w, rs[p], y);
	} else {
		y = p;
		split(ls[p], w, x, ls[p]);
	}
	pushup(p);
}
inline int merge(int x, int y) {
	if(!x || !y) return x + y;
	if(pri[x] > pri[y]) {
		rs[x] = merge(rs[x], y); 
		pushup(x);
		return x;
	} else {
		ls[y] = merge(x, rs[y]);
		pushup(y);
		return y;
	}
}
inline void insert(int w) {
	int x, y;
	split(rt, w - 1, x, y);
	rt = merge(merge(x, build(w)), y);
}
inline void erase(int w) {
	int x, y, z;
	split(rt, w, x, z);
	split(x, w - 1, x, y);
	if(y) y = merge(ls[y], rs[y]);
	rt = merge(merge(x, y), z);
}
inline int getpre(int w) {
	int x, y, z;
	split(rt, w - 1, x, y);
	z = x;
	while(rs[x]) x = rs[x];
	int res = val[x];
	rt = merge(z, y);
	return res;
}
inline int getsuc(int w) {
	int x, y, z;
	split(rt, w, x, y);
	z = y;
	while(ls[y]) y = ls[y];
	int res = val[y];
	rt = merge(x, z);
	return res;
}
inline int getrk(int w) {
	int x, y;
	split(rt, w - 1, x, y);
	int res = size[x] + 1;
	rt = merge(x, y);
	return res;
}
inline int getkth(int p, int k) {
	if(k == size[ls[p]] + 1) return val[p];
	else if(k < size[ls[p]] + 1) return getkth(ls[p], k);
	else return getkth(rs[p], k - size[ls[p]] - 1);
}
int main() {
	int q, op, a, b, c;
	scanf("%d", &q);
	while(q--) {
		scanf("%d%d", &op, &a);
		if(op == 1) insert(a);
		if(op == 2) erase(a);
		if(op == 3) printf("%d\n", getrk(a));
		if(op == 4) printf("%d\n", getkth(rt, a));
		if(op == 5) printf("%d\n", getpre(a));
		if(op == 6) printf("%d\n", getsuc(a));
	}
	return 0;
}
2022/2/23 15:07
加载中...