自己敲一个模板以后用
#include <cstdio>
#include <iostream>
#include <iomanip>
#include <string>
#include <cstdlib>
#include <cstring>
#include <queue>
#include <set>
#include <vector>
#include <map>
#include <algorithm>
#include <cmath>
#include <stack>
#define INF 0x3f3f3f3f
#define IMAX 2147483646
#define LINF 0x3f3f3f3f3f3f3f3f
#define ll long long
#define ull unsigned long long
#define uint unsigned int
using namespace std;
struct T {
int lc, rc;
int dat;
}t[211111 * 32];
int cnt, root[211111], sorted[211111], a[211111];
int insert(int now, int pos, int l,int r) {
t[++cnt] = t[now], t[cnt].dat++;
int p = cnt;
if (l == r)return p;
int mid = (l + r) / 2;
if (pos <= mid)t[p].lc = insert(t[now].lc, pos, l, mid);
else t[p].rc = insert(t[now].rc, pos, mid + 1, r);
return p;
}
int ask(int s, int e, int l, int r, int k) {
if (l == r)return l;
int mid = (l + r) / 2;
int sum = t[t[e].lc].dat - t[t[s].lc].dat;
if (k <= sum)return ask(t[s].lc, t[e].lc, l, mid, k);
else return ask(t[s].rc, t[e].rc, mid + 1, r, k - sum);
}
int n, m, len, pos, l, r, k;
int main() {
scanf("%d%d", &n, &m);
cnt = 0, root[0] = 0;
for (int i = 1; i <= n; i++)
scanf("%d", a + i), sorted[i] = a[i];
sort(sorted + 1, sorted + n + 1);
len = unique(sorted + 1, sorted + n + 1) - (sorted + 1);
for (int i = 1; i <= n; i++)
root[i] = insert(root[i - 1],
lower_bound(sorted + 1, sorted + n + 1, a[i]) - sorted, 1, len);
while (m--) {
scanf("%d%d%d", &l, &r, &k);
pos = ask(root[l - 1], root[r], 1, len, k);
printf("%d\n", sorted[pos]);
}
return 0;
}