MnZn 刚学 OI,主席树WA ON #7求调
查看原帖
MnZn 刚学 OI,主席树WA ON #7求调
434929
Usada_Pekora楼主2022/6/27 19:46
#include <bits/stdc++.h>
using namespace std;
const int N = 3e5 + 5;
int n, m;
int a[N], b[N];
int rt[N], ls[N * 22], rs[N * 22], sum[N * 22], cnt;
inline int modify(int pre, int l, int r, int x) {
	int p = ++cnt;
	ls[p] = ls[pre], rs[p] = rs[pre], sum[p] = sum[pre] + 1;
	if(l == r) return p;
	int mid = l + r >> 1;
	if(x <= mid) ls[p] = modify(ls[pre], l, mid, x);
	else rs[p] = modify(rs[pre], mid + 1, r, x);
	return p;
}
inline int query(int l, int r, int L, int R, int k) {
	if(l == r) return b[l + 1];
	int tot = sum[ls[R]] - sum[ls[L]], mid = l + r >> 1;
	if(tot >= k) return query(l, mid, ls[L], ls[R], k);
	else return query(mid + 1, r, rs[L], rs[R], k - tot);
}
inline int build(int l, int r) {
	int p = ++cnt;
	if(l == r) return p;
	int mid = l + r >> 1;
	ls[p] = build(l, mid);
	rs[p] = build(mid + 1, r);
	return p;
}
signed main() {
	ios::sync_with_stdio(false);
	cin >> n >> m;
	for(int i = 1; i <= n; i++) cin >> a[i], b[i] = a[i];
	int len = n;
	sort(b + 1, b + len + 1);
	len = unique(b + 1, b + len + 1) - b - 1;
	for(int i = 1; i <= n; i++) a[i] = lower_bound(b + 1, b + len + 1, a[i]) - b - 1;
	rt[0] = build(1, len);
	for(int i = 1; i <= n; i++) rt[i] = modify(rt[i - 1], 1, len, a[i]);
	for(int i = 1; i <= m; i++) {
		int l, r, k;
		cin >> l >> r >> k;
		cout << query(1, len, rt[l - 1], rt[r], k) << '\n';
	}
    return 0;
}
2022/6/27 19:46
加载中...