主席树模版
#include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int maxn = 100010; int ls[maxn*20], rs[maxn*20], sum[maxn*20]; int T[maxn], tot; void build(int l, int r, int& rt) { rt = ++tot; sum[rt] = 0; if(l == r) return; int m = l+r>>1; build(l, m, ls[rt]); build(m+1, r, rs[rt]); } void update(int last, int p, int l, int r, int& rt) { rt = ++tot; ls[rt] = ls[last]; rs[rt] = rs[last]; sum[rt] = sum[last]+1; if(l == r) return; int m = l+r>>1; if(p <= m) update(ls[last], p, l, m, ls[rt]); else update(rs[last], p, m+1, r, rs[rt]); } int query(int x, int y, int l, int r, int k) { if(l == r) return l; int m = l+r>>1; int cnt = sum[ls[y]]-sum[ls[x]]; if(k <= cnt) return query(ls[x], ls[y], l, m, k); else return query(rs[x], rs[y], m+1, r, k-cnt); } int num[maxn], a[maxn], n, q; void cal() { for(int i = 1; i <= n; i++) { scanf("%d", &a[i]); num[i] = a[i]; } tot = 0; sort(num+1, num+n+1); int cnt = unique(num+1, num+n+1)-(num+1); build(1, cnt, T[0]); for(int i = 1; i <= n; i++) { a[i] = lower_bound(num+1, num+cnt+1, a[i])-num; } for(int i = 1; i <= n; i++) update(T[i-1], a[i], 1, cnt, T[i]); while(q--) { int x, y, k; scanf("%d %d %d", &x, &y, &k); printf("%d\n", num[query(T[x-1], T[y], 1, cnt, k)]); } } int main() { int T; scanf("%d", &T); while(T--) { scanf("%d %d", &n, &q); cal(); } return 0; }