50 pts 求条
查看原帖
50 pts 求条
867577
lucasincyber楼主2024/12/14 16:24

一直 50 分,大佬求条

#include <bits/stdc++.h>
#define int long long
using namespace std;

const int N = 2e5 + 5;

int n, q, cur;
int a[N], b[N], rt[N];

struct per_seg_tree
{
	struct node
	{
		int ls, rs, num;
	} tr[N << 5];
	int build(int l, int r)
	{
		int p = ++cur;
		if (l == r) return p;
		int mid = (l + r) >> 1;
		tr[p].ls = build(l, mid);
		tr[p].rs = build(mid + 1, r);
		return p;
	}
	int modify(int orp, int l, int r, int pos)
	{
		int p = ++cur;
		tr[p] = {tr[orp].ls, tr[orp].rs, tr[orp].num + 1};
		if (l == r) return p;
		int mid = (l + r) >> 1;
		if (pos <= mid) tr[p].ls = modify(tr[orp].ls, l, mid, pos);
		else tr[p].rs = modify(tr[orp].rs, mid + 1, r, pos);
		return p;
	}
	int query(int u, int v, int l, int r, int k)
	{
		if (l >= r) return l;
		int tmp = tr[tr[v].ls].num - tr[tr[u].ls].num, mid = (l + r) >> 1, res = 0;
		if (k <= tmp) res = query(tr[u].ls, tr[v].ls, l, mid, k);
		else res = query(tr[u].rs, tr[v].rs, mid + 1, r, k - tmp);
		return res;
	}
} PST; 

signed main()
{
	scanf("%lld%lld", &n, &q);
	for (int i = 1; i <= n; i++)
		scanf("%lld", &a[i]), b[i] = a[i];
    sort(b + 1, b + n + 1);
	int m = unique(b + 1, b + n + 1) - b - 1;
	rt[0] = PST.build(1, m);
	for (int i = 1; i <= m; i++)
	{
		int pos = lower_bound(b + 1, b + m + 1, a[i]) - b;
		rt[i] = PST.modify(rt[i - 1], 1, m, pos);
	}
	while (q--)
	{
		int l, r, k;
		scanf("%lld%lld%lld", &l, &r, &k);
		int e = PST.query(rt[l - 1], rt[r], 1, m, k);
		printf("%lld\n", b[e]);
	}
	return 0;
}
2024/12/14 16:24
加载中...