FHQTreap TLE+WA52pts求条
查看原帖
FHQTreap TLE+WA52pts求条
682196
2022dyxwitHLove楼主2024/7/28 20:52

样例已过

#include <bits/stdc++.h>
using namespace std;
const int N = 2e6 + 5;
int m, n, idx, rt, rt1, rt2, rt3, ret, lst, ans;
struct FHQ{
	int ls;
	int rs;
	int siz;
	int val;
	int rnd;
}tree[N];
inline void pushup(int x) {
	tree[x].siz = tree[tree[x].ls].siz + tree[tree[x].rs].siz + 1;
}
inline void split(int now, int val, int &x, int &y) {
	if (!now) {
		x = y = 0;
		return;
	}
	if (tree[now].val <= val) {
		x = now;
		split(tree[now].rs, val, tree[now].rs, y);
	}
	else {
		y = now;
		split(tree[now].ls, val, x, tree[now].ls);
	}
	pushup(now);
}
inline int merge(int x, int y) {
	if (!x) return y;
	if (!y) return x;
	if (tree[x].rnd < tree[y].rnd) {
		tree[x].rs = merge(tree[x].rs, y);
		pushup(x);
		return x;
	}
	else {
		tree[y].ls = merge(x, tree[y].ls);
		pushup(y);
		return y;
	}
}
inline int create(int x) {	
	tree[++idx].val = x;
	tree[idx].siz = 1;
	tree[idx].rnd = rand();
	return idx;
}
inline void insert(int x) {
	split(rt, x, rt1, rt2);
	rt = merge(merge(rt1, create(x)), rt2);
}
inline void del(int x) {
	split(rt, x, rt2, rt3);
	split(rt2, x - 1, rt1, rt2);
	rt2 = merge(tree[rt2].ls, tree[rt2].rs);
	rt = merge(merge(rt1, rt2), rt3);
}
inline int rk(int x) {
	split(rt, x - 1, rt1, rt2);
	ret = tree[rt1].siz + 1;
	rt = merge(rt1, rt2);
	return ret;
}
inline int kth(int now, int k) {
	while(1) {
		if (k <= tree[tree[now].ls].siz) now = tree[now].ls;
		else if (k == tree[tree[now].ls].siz + 1) return tree[now].val;
		else {
			k -= tree[tree[now].ls].siz + 1;
			now = tree[now].rs;
		}
	}
}
inline int pre(int x) {
	split(rt, x - 1, rt1, rt2);
	ret = kth(rt1, tree[rt1].siz);
	rt = merge(rt1, rt2);
	return ret;
}
inline int suf(int x) {
	split(rt, x, rt1, rt2);
	ret = kth(rt2, 1);
	rt = merge(rt1, rt2);
	return ret;
}
int main() {
	cin.tie(0) -> sync_with_stdio(0);
	cin >> m >> n;
	for (int i = 1, x; i <= m; ++i) {
		cin >> x;
		insert(x);
	}
	for (int i = 1, op, x; i <= n; ++i) {
		cin >> op >> x;
		x ^= lst;
		lst = 0;
		if (op == 1) insert(x);
		if (op == 2) del(x);
		if (op == 3) lst = rk(x);
		if (op == 4) lst = kth(rt, x);
		if (op == 5) lst = pre(x);
		if (op == 6) lst = suf(x);
		ans ^= lst;
	}
	cout << ans;
}
2024/7/28 20:52
加载中...