ACon#1#2,样例已过,手搓的数据全是对的,讨论区中警示后人都注意了,怎么都过不了,调了一天了,恳请大佬帮忙看看
#include <bits/stdc++.h>
#define mid ((l + r) >> 1)
using namespace std;
const int N = 1e8;
int n, m, a[N], rt[N], idx = 1, ret[N], tmp, v[N];
unordered_map <int, bool> vis;
unordered_map <int, int> uni;
struct Node{
int l;
int r;
int val;
}node[N];
void build(int l, int r, int x) {
if (l == r) return;
node[x].l = ++idx;
build(l, mid, idx);
node[x].r = ++idx;
build(mid + 1, r, idx);
}
void modify(int l, int r, int x, int nx, int y) {
if (l == r) {
node[nx].val = 1;
return;
}
if (y <= mid) {
node[nx].l = ++idx;
node[nx].r = node[x].r;
modify(l, mid, node[x].l, idx, y);
}
else {
node[nx].l = node[x].l;
node[nx].r = ++idx;
modify(mid + 1, r, node[x].r, idx, y);
}
node[nx].val = node[x].val + 1;
}
int query(int l, int r, int x, int nx, int y) {
if (l == r) return l;
int num = node[node[nx].l].val - node[node[x].l].val;
if (y <= num) return query(l, mid, node[x].l, node[nx].l, y);
return query(mid + 1, r, node[x].r, node[nx].r, y - num);
}
int main() {
cin.tie(0) -> sync_with_stdio(false);
cin >> n >> m;
for (int i = 1; i <= n; ++i) {
cin >> a[i];
if (!vis[a[i]]) v[++tmp] = a[i];
}
sort(v + 1, v + tmp + 1);
for (int i = 1; i <= tmp; ++i) {
uni[v[i]] = i;
ret[i] = v[i];
}
for (int i = 1; i <= n; ++i) a[i] = uni[a[i]];
rt[0] = 1;
build(1, tmp, 1);
for (int i = 1; i <= n; ++i) {
rt[i] = ++idx;
modify(1, tmp, rt[i - 1], idx, a[i]);
}
for (int i = 1, x, y, z; i <= m; ++i) {
cin >> x >> y >> z;
cout << ret[query(1, tmp, rt[x - 1], rt[y], z)] << '\n';
}
}