rt,只过了前五个点。
#include <bits/stdc++.h>
#define int long long
#define chk_die printf("ALIVE\n")
using namespace std;
int read() {
int s = 0, f = 1;
char ch = getchar();
while (ch < '0' || ch > '9')
f = (ch == '-' ? -1 : 1), ch = getchar();
while (ch >= '0' && ch <= '9')
s = (s << 1) + (s << 3) + (ch ^ 48), ch = getchar();
return s * f;
}
int n, m;
int a[200005], b[200005];
int l[200005], r[200005], k[200005];
int ans[200005];
struct Value {
int pos, v;
};
struct Query {
int l, r, k, id;
};
struct bits_tree {
#define lb(x) (x & (-x))
int sum[200005];
void clear() {
memset(sum, 0, sizeof sum);
}
void mdf(int x, int v) {
while (x <= n)
sum[x] += v, x += lb(x);
}
int qry(int x) {
int res = 0;
while (x)
res += sum[x], x -= lb(x);
return res;
}
} t;
void solve(int l, int r, vector<Value> a, vector<Query> q) {
t.clear();
if (l == r) {
for (int i = 0; i < q.size(); i++)
ans[q[i].id] = l;
return ;
}
int mid = (l + r) / 2;
vector<Value> a1, a2;
vector<Query> q1, q2;
for (int i = 0; i < a.size(); i++)
if (a[i].v <= mid)
a1.push_back(a[i]), t.mdf(a[i].pos, 1);
else
a2.push_back(a[i]);
for (int i = 0; i < q.size(); i++) {
int vt = t.qry(q[i].r) - t.qry(q[i].l - 1);
if (q[i].k <= vt)
q1.push_back(q[i]);
else
q[i].k -= vt, q2.push_back(q[i]);
}
solve(l, mid, a1, q1), solve(mid + 1, r, a2, q2);
return ;
}
signed main() {
n = read(), m = read();
for (int i = 1; i <= n; i++)
b[i] = a[i] = read();
sort(b + 1, b + n + 1);
int tot = unique(b + 1, b + n + 1) - b - 1;
for (int i = 1; i <= n; i++)
a[i] = lower_bound(b + 1, b + tot + 1, a[i]) - b;
for (int i = 1; i <= m; i++)
l[i] = read(), r[i] = read(), k[i] = read();
vector<Value> av;
vector<Query> aq;
for (int i = 1; i <= n; i++)
av.push_back((Value){i, a[i]});
for (int i = 1; i <= m; i++)
aq.push_back((Query){l[i], r[i], k[i], i});
solve(1, tot, av, aq);
for (int i = 1; i <= m; i++)
printf("%lld\n", b[ans[i]]);
return 0;
}