0
1
mirror of https://git.sb/baoshuo/OI-codes.git synced 2024-11-30 19:36:27 +00:00
OI-codes/S2OJ/164/data/std.cpp

53 lines
1.4 KiB (Stored with Git LFS)
C++

#include <bits/stdc++.h>
using namespace std;
inline int read() {
int x = 0, f = 1, c = getchar();
while (c < 48) c == '-' && (f = -1), c = getchar();
while (c > 47) x = x * 10 + c - '0', c = getchar();
return x * f;
}
const int MAXN = 200005;
int ls[MAXN * 32], rs[MAXN * 32], sum[MAXN * 32];
int rt[MAXN], val[MAXN], raw[MAXN];
int n, m, q, tot;
void insert(int &x, int y, int l, int r, int k) {
ls[x = ++tot] = ls[y];
rs[x] = rs[y];
sum[x] = sum[y] + 1;
if (l == r) return;
int mid = (l + r) >> 1;
if (k <= mid) insert(ls[x], ls[y], l, mid, k);
if (k > mid) insert(rs[x], rs[y], mid + 1, r, k);
}
int query(int x, int y, int l, int r, int k) {
if (l == r) return l;
int mid = (l + r) >> 1, s = sum[ls[y]] - sum[ls[x]];
if (k <= s) return query(ls[x], ls[y], l, mid, k);
return query(rs[x], rs[y], mid + 1, r, k - s);
}
int main(int argc, char const *argv[]) {
n = read();
q = read();
for (int i = 1; i <= n; ++i)
val[i] = raw[i] = read();
sort(val + 1, val + n + 1);
m = unique(val + 1, val + n + 1) - val - 1;
for (int i = 1, k; i <= n; ++i) {
k = lower_bound(val + 1, val + m + 1, raw[i]) - val;
insert(rt[i], rt[i - 1], 1, m, k);
}
for (int i = 1, l, r, k, x; i <= q; ++i) {
l = read();
r = read();
k = read();
x = query(rt[l - 1], rt[r], 1, m, k);
printf("%d\n", val[x]);
}
return 0;
}