主席树 96pts WA#20
查看原帖
主席树 96pts WA#20
469375
Imtking楼主2023/9/13 21:14
#include <iostream>
#include <unordered_map>
#include <cstdio>

#define int long long

using namespace std;

const int inf = 2147483647;

struct tree
{
	int k, ls, rs;
} t[500100 << 5];
int rt[500100], cnt;
unordered_map<int, int> m;

inline int copy(int tp)
{
	t[++cnt] = t[tp];
	return cnt;
}

inline void insert(int &tp, int l, int r, int x, int k)
{
	tp = copy(tp);
	t[tp].k += k;
	if (l == r) return;
	int mid = (l + r) >> 1;
	if (x <= mid) insert(t[tp].ls, l, mid, x, k);
	else insert(t[tp].rs, mid + 1, r, x, k);
}

inline int rk(int tp, int l, int r, int ql, int qr)
{
	if (!tp) return 0;
	if (ql <= l && r <= qr) return t[tp].k;
	int mid = (l + r) >> 1, ans = 0;
	if (ql <= mid) ans += rk(t[tp].ls, l, mid, ql, qr);
	if (mid < qr) ans += rk(t[tp].rs, mid + 1, r, ql, qr);
	return ans;
}

inline int kth(int tp, int l, int r, int k)
{
	if (l == r) return l;
	int mid = (l + r) >> 1, x = t[t[tp].ls].k;
	if (x >= k) return kth(t[tp].ls, l, mid, k);
	else return kth(t[tp].rs, mid + 1, r, k - x);
}

signed main()
{
	int n; cin >> n;
	for (int i = 1; i <= n; ++i)
	{
		int v, op, x;
		cin >> v >> op >> x;
		rt[i] = rt[v];
		if (op == 1) insert(rt[i], -inf, inf, x, 1), ++m[x];
		if (op == 2) if (m[x] > 0) insert(rt[i], -inf, inf, x, -1), --m[x];
		if (op == 3) cout << rk(rt[i], -inf, inf, -inf, x - 1) + 1 << "\n";
		if (op == 4) cout << kth(rt[i], -inf, inf, x) << "\n";
		if (op == 5) cout << kth(rt[i], -inf, inf, rk(rt[i], -inf, inf, -inf, x - 1)) << "\n";
		if (op == 6) cout << kth(rt[i], -inf, inf, rk(rt[i], -inf, inf, -inf, x) + 1) << "\n";
	}
	return 0;
}
2023/9/13 21:14
加载中...