主席树 RE 求调
查看原帖
主席树 RE 求调
688783
SilverLi楼主2023/6/28 20:38
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 1e6 + 5;
int n, Q;
int a[N];
int st, s[N];
int cnt, root[N];
struct tree { int l, r, sum; }t[N];
#define lu t[u].l
#define lv t[v].l
#define ru t[u].r
#define rv t[v].r
#define sumu t[u].sum
#define sumv t[v].sum
#define mid (l + r >> 1)
void build(int u, int l, int r) {
	if (l == r)	return;
	lu = ++cnt;
	build(lu, 1, mid);
	ru = ++cnt;
	build(ru, mid + 1, r);
}
int insert(int u, int l, int r, int p) {
	int v = ++cnt;
	lv = lu, rv = ru, sumv = sumu + 1;
	if (l == r)
		return v;
	if (p <= mid)
		lv = insert(lu, 1, mid, p);
	else
		rv = insert(ru, mid + 1, r, p);
	return v;
}
int ans(int u, int v, int l, int r, int k) {
	if (l == r)	return l;
	// left
	int d = t[lv].sum - t[lu].sum;
	if (d >= k)
		return ans(lu, lv, 1, mid, k);
	else
		return ans(ru, rv, mid + 1, r, k - d);
}
signed main() {
	cin >> n >> Q;
	for (int i = 1; i <= n; ++i)
		cin >> a[i];
	copy(a + 1, a + n + 1, s + 1);
	sort(s + 1, s + n + 1);
	st = unique(s + 1, s + n + 1) - s - 1;
	root[0] = ++cnt;
	build(root[0], 1, st);
	for (int i = 1; i <= n; ++i) {
		int p = lower_bound(s + 1, s + st + 1, a[i]) - s;
		root[i] = insert(root[i - 1], 1, st, p);
	}
	while (Q--) {
		int l, r, k;
		cin >> l >> r >> k;
		cout << s[ans(root[l - 1], root[r], 1, st, k)] << '\n';
	}
	return 0;
}
2023/6/28 20:38
加载中...