社区讨论

RE56pts求调

P6136【模板】普通平衡树(数据加强版)参与者 2已保存回复 3

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
3 条
当前快照
1 份
快照标识符
@mlkcg4lc
此快照首次捕获于
2026/02/13 11:44
6 天前
此快照最后确认于
2026/02/15 23:10
4 天前
查看原帖
CPP
#include <iostream>
#define int long long
using namespace std;
const int N = 20000010;
int n, m, key[N], r[N], s[N], son[N][2], ans, x, op, cnt, root, ans1;
int seed = 25374643;

int rnd() {
	return seed = (seed * 2+ 23)%1000000007;
}

void pu(int i) {
	s[i] = s[son[i][0]] + s[son[i][1]] + 1;
}

void split(int x, int val, int &a, int &b) {
	if (x == 0) {
		a = b = 0;
		return;
	}

	if (key[x] < val) {
		a = x;
		split(son[x][1], val, son[x][1], b);
	} else {
		b = x;
		split(son[x][0], val, a, son[x][0]);
	}

	pu(x);
}

int merge(int a, int b) {
	if (!a || !b)
		return a ^ b;

	if (r[a] < r[b]) {
		son[a][1] = merge(son[a][1], b);
		pu(a);
		return a;
	}

	son[b][0] = merge(a,son[b][0]);
	pu(b);
	return b;
}

void ins(int a) {
	int tmp1, tmp2;
	split(root, a, tmp1, tmp2);
	key[++cnt] = a;
	r[cnt] = rnd();
	s[cnt] = 1;
	root = merge(merge(tmp1, cnt), tmp2);
}

void del(int a) {
	int tmp1, tmp2, tmp3;
	split(root, a, tmp1, tmp2);
	split(tmp2, a + 1, tmp2, tmp3);
	tmp2 = merge(son[tmp2][0], son[tmp2][1]);
	tmp2 = merge(tmp2, tmp3);
	root = merge(tmp1, tmp2);
}

void qsm(int a) {
	int tmp1, tmp2;
	split(root, a, tmp1, tmp2);
	ans = s[tmp1]+1;
	root = merge(tmp1, tmp2);
}

void qth(int x, int a) {
	if (a == s[son[x][0]] + 1) {
		ans = key[x];
		return;
	}

	if (a < s[son[x][0]] + 1)
		qth(son[x][0], a);
	else
		qth(son[x][1], a - s[son[x][0]] - 1);
}

void qbf(int a) {
	qsm(a);
	qth(root,ans-1);
}

bool qxt(int a) {
	qsm(a+1);
	qth(root,ans);
}
signed main() {
	cin >> n >> m;

	for (int i = 1; i <= n; ++i) {
		cin >> x;
		ins(x);
	}

	while (m--) {
		cin >> op >> x;
		x ^= ans;

		switch (op) {

			case 1:
				ins(x);
				break;

			case 2:
				del(x);
				break;

			case 3:
				qsm(x);
				break;

			case 4:
				qth(root, x);
				break;

			case 5:
				qbf(x);
				break;

			case 6:
				qxt(x);
				break;
        }
        if(op >= 3)ans1 ^= ans;
	}

	cout << ans1;
}
RE on 7 9 16 17 19 20 21 22 23 24

回复

3 条回复,欢迎继续交流。

正在加载回复...