样例未过,大佬求调
查看原帖
样例未过,大佬求调
534953
Furina_zbg楼主2025/7/24 19:14
#include<bits/stdc++.h>
using namespace std;
struct node {
	int x, l, r;
}tree[(1 << 4) * 100000];
int root[200200], tot;
int setup(int id) {
	++tot;
	tree[tot] = tree[id];
	return tot;
}
int build (int l, int r) {
	int id = ++tot;
	if(l == r) {
		tree[id].x = 0;
		return tot;
	}
	int mid = (l + r) >> 1;
	tree[id].l = build(l, mid);
	tree[id].r = build(mid + 1, r);
	return id;
}
int update(int id, int l, int r, int u) {
	id = setup(id);
	++tree[id].x;
	if(l == r){
		return id;
	}
	int mid = (l + r) >> 1;
	if(u <= mid)
		tree[id].l = update(tree[id].l, l, mid, u);
	else
		tree[id].r = update(tree[id].r, mid + 1, r, u);
	return id;
}
int query(int idl, int idr, int l, int r, int u) {
	if(l == r) return l;
	int mid = (l + r) >> 1;
	int k = tree[idr].x - tree[idl].x;
	if(u <= k)
		return query(tree[idl].l, tree[idr].l, l, mid, u);
	else
		return query(tree[idl].r, tree[idr].r, mid + 1, r, u - k);
}
int a[200100], b[200100];
int n, m;
int get_(int x) {
	return lower_bound(b + 1, b + m + 1, x) - b;
}
int main () {
	int i; int Q;
	scanf ("%d %d", &n, &Q);
	for (i = 1; i <= n; ++i) scanf ("%d", &a[i]), b[i] = a[i];
	sort(b + 1, b + n + 1);
	m = unique(b + 1, b + n + 1) - b - 1;
	root[0] = build(1, n);
	for (i = 1; i <= n; ++i)
		root[i] = update(root[i - 1], 1, n, get_(a[i]));
	while (Q--) {
		int l, r, k;
		scanf ("%d %d %d", &l, &r, &k);
		printf ("%d\n", b[query(root[l - 1], root[r], 1, n, k)]);
	}
}

2025/7/24 19:14
加载中...