球跳炫管
查看原帖
球跳炫管
1198462
dvsfanjo楼主2024/10/20 16:14
#include <bits/stdc++.h> 
using namespace std;
using ll = long long;
const int N = 2e6 + 5;
const ll inf = (1ll << 31) - 1;
ll n, m, ans, lst, op, a, idx;
ll l[N], r[N], sz[N], val[N], key[N], ver[N];
inline ll New(ll v) {
	sz[++idx] = 1;
	val[idx] = v;
	key[idx] = rand();
	return idx;
}
inline void Update(ll u) {
	sz[u] = sz[l[u]] + sz[r[u]] + 1;
	return;
}
inline ll Copy(ll u) {
	sz[++idx] = sz[u];
	val[idx] = val[u];
	key[idx] = key[u];
	l[idx] = l[u];
	r[idx] = r[u];
	return idx;
}
void Split(ll u, ll v, ll &x, ll &y) {
	if (!u) {
		x = y = 0;
		return;
	}
	ll z = Copy(u);
	if (val[u] <= v) {
		x = z;
		Split(r[z], v, r[z], y);
	} else {
		y = z;
		Split(l[z], v, x, l[z]);
	}
	Update(z);
	return;
}
ll Merge(ll x, ll y) {
	if (!x || !y)
		return x | y;
	ll z;
	if (key[x] < key[y]) {
		z = Copy(y);
		r[z] = Merge(r[z], y);
	} else {
		z = Copy(x);
		l[z] = Merge(x, l[z]);
	}
	Update(z);
	return z;
}
inline ll Insert(ll root, ll v) {
	ll x, y, z;
	z = New(v);
	Split(root, v, x, y);
	return Merge(Merge(x, z), y);
}
inline ll Delete(ll root, ll v) {
	ll x, y, z;
	Split(root, v, x, y);
	Split(x, v - 1, x, z);
	z = Merge(l[z], r[z]);
	return Merge(Merge(x, z), y);
}
inline ll Rank(ll root, ll v) {
	ll x, y, ans;
	Split(root, v - 1, x, y);
	ans = sz[x] + 1;
	root = Merge(x, y);
	return ans;
}
ll K_th(ll u, ll k) {
	if (!u)
		return 1;
	if (sz[l[u]] + 1 == k)
		return val[u];
	if (k <= sz[l[u]])
		return K_th(l[u], k);
	return K_th(r[u], k - sz[l[u]] - 1);
}
inline ll Pre(ll root, ll v) {
	ll x, y, ans;
	if (K_th(root, 1) > v)
		return -inf;
	Split(root, v - 1, x, y);
	ans = K_th(x, sz[x]);
	root = Merge(x, y);
	return ans;
}
inline ll Suc(ll root, ll v) {
	ll x, y, ans;
	if (K_th(root, sz[root]) < v)
		return inf;
	Split(root, v, x, y);
	ans = K_th(y, 1);
	root = Merge(x, y);
	return ans;
}
int main()
{
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	cin >> m;
	ver[0] = 0;
	for (int i = 1; i <= m; i++) {
		cin >> n >> op >> a;
		if (op == 1)
			ver[i] = Insert(ver[n], a);
		else if (op == 2)
			ver[i] = Delete(ver[n], a);
		else if (op == 3)
			cout << Rank(ver[n], a) << '\n';
		else if (op == 4)
			cout << K_th(ver[n], a) << '\n';
		else if (op == 5)
			cout << Pre(ver[n], a) << '\n';
		else if (op == 6)
			cout << Suc(ver[n], a) << '\n';
		if (op != 1 && op != 2)
			ver[i] = ver[n];
	}
	return 0;
}
2024/10/20 16:14
加载中...