RE求助,本地样例过了,而且也有写返回值
查看原帖
RE求助,本地样例过了,而且也有写返回值
349713
灰的积雨云楼主2022/11/30 17:14
#include <cstdio>
#include <iostream>
#include <cstring>
#include <algorithm>
#define lfor(i, x, y) for (int i = x; i <= y; ++ i)
#define rfor(i, x, y) for (int i = x; i >= y; -- i)
using namespace std;

const int N = 2e5 + 10;
const int logN = 32;
struct SGT
{
	struct Node
	{
		int l, r;
		int dat;
		#define dat(p) sgt[p].dat
		#define l(p) sgt[p].l
		#define r(p) sgt[p].r
	}sgt[N * logN];
	int P, root[N];

	int build(int l, int r)
	{
		int p = ++ P; dat(p) = 0;
		if (l == r) return p;
		int mid = (l + r) >> 1;
		l(p) = build(l, mid), r(p) = build(mid + 1, r);
	}

	int insert(int now, int l, int r, int pos, int val)
	{
		int p = ++ P;
		sgt[p] = sgt[now];
		if (l == r) {dat(p) += val; return p;}
		int mid = (l + r) >> 1;
		if (pos <= mid) l(p) = insert(l(now), l, mid, pos, val);
		else r(p) = insert(r(now), mid + 1, r, pos, val);
		dat(p) = dat(l(p)) + dat(r(p));
		return p;
	}

	int ask(int p, int q, int l, int r, int k)
	{
		if (l == r) return l;
		int mid = (l + r) >> 1;
		int lcnt = dat(l(p)) - dat(l(q));
		if (k <= lcnt) return ask(l(p), l(q), l, mid, k);
		else return ask(r(p), r(q), mid + 1, r, k - lcnt);
	}
}T;	
int a[N], b[N];

int main()
{
	int n, m; scanf("%d %d", &n, &m);
	lfor (i, 1, n) scanf("%d", &a[i]), b[i] = a[i];
	sort(b + 1, b + 1 + n);
	int t = unique(b + 1, b + 1 + n) - (b + 1);
	T.root[0] = T.build(1, t);
	lfor (i, 1, n) T.root[i] = T.insert(T.root[i - 1], 1, t, lower_bound(b + 1, b + 1 + t, a[i]) - b, 1);
	lfor (i, 1, m) 
	{
		int l, r, k; scanf("%d %d %d", &l, &r, &k);
		int ans = T.ask(T.root[r], T.root[l - 1], 1, t, k);
		printf("%d\n", b[ans]);
	}
	return 0;
}
2022/11/30 17:14
加载中...