#include <bits/stdc++.h> using namespace std; const int maxn = 1e5+10; int root[maxn], ls[maxn*20], rs[maxn*20]; int sz; int sum[maxn*20]; int num[maxn]; int dis_num[maxn]; int n, q; int cnt = 0; void build(int &rt, int l ,int r){ rt = ++cnt; sum[rt] = 0; if(l == r) return; int mid = (l+r)/2; build(ls[rt], l, mid); build(rs[rt], mid+1, r); } void update(int &now, int last, int val, int l, int r){ now = ++cnt; ls[now] = ls[last]; rs[now] = rs[last]; sum[now] = sum[last]+1; if(l == r) return ; int mid = (l+r)/2; if(val<=mid) update(ls[now], ls[last], val, l, mid); else update(rs[now], rs[last], val, mid+1, r); } int query(int x, int y, int k, int l, int r){ if(l == r) return l; int cnt = sum[ls[y]] - sum[ls[x]]; int mid = (l+r)/2; if(cnt>=k) return query(ls[x], ls[y], k, l, mid); else return query(rs[x], rs[y], k-cnt, mid+1, r); } int main(){ int T; scanf("%d", &T); while(T--){ scanf("%d%d", &n, &q); for(int i=1; i<=n; i++){ scanf("%d", &num[i]); dis_num[i] = num[i]; } sort(num+1, num+n+1); sz = unique(num+1, num+n+1)-(num+1); for(int i=1; i<=n; i++){ dis_num[i] = lower_bound(num+1, num+n+1, dis_num[i])-(num); } cnt = 0; build(root[0], 1, sz); for(int i=1; i<=n; i++)update(root[i], root[i-1], dis_num[i], 1, n); int k, x, y; for(int i=0; i<q; i++){ scanf("%d%d%d", &x, &y, &k); printf("%d\n", num[query(root[x-1], root[y], k, 1, n)]); } } }
|