1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102
|
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <math.h> #include <iostream> #include <algorithm>
using namespace std;
#define Pair pair<LL,LL> #define Combine Pair, greater<Pair>, pairing_heap_tag #define LL long long #define ll long long #define ULL unsigned long long #define ls rt<<1 #define rs rt<<1|1 #define one first #define two second #define MS 100009 #define INF 1e18 #define DBINF 1e100 #define Pi acos(-1.0) #define eps 1e-9 #define mod 99999997
int n,m; struct node{ int count; int lls,rrs; }p[MS<<5]; int rtpos[MS]; int a[MS],ta; int b[MS]; int tot;
int build(int l,int r){ int rt = ++tot; if(l == r) return rt; int m = l+r>>1; p[rt].lls = build(l,m); p[rt].rrs = build(m+1,r); return rt; }
int update(int lart,int l,int r,int pos){ int rt = ++tot; p[rt] = p[lart]; p[rt].count++; if(l == r) return rt; int m = l+r>>1; if(m >= pos) p[rt].lls = update(p[lart].lls,l,m,pos); else p[rt].rrs = update(p[lart].rrs,m+1,r,pos); return rt; }
int get_kth(int lrt,int rrt,int l,int r,int k){ if(l == r) return l; int x = p[p[rrt].lls].count - p[p[lrt].lls].count; int m = l+r>>1; if(k <= x) return get_kth(p[lrt].lls,p[rrt].lls,l,m,k); else return get_kth(p[lrt].rrs,p[rrt].rrs,m+1,r,k-x); }
void solve(){ tot = 0; scanf("%d %d",&n,&m); for(int i=1;i<=n;i++){ scanf("%d",&a[i]); b[i] = a[i]; } sort(a+1,a+n+1); ta = 1; for(int i=2;i<=n;i++){ if(a[i] != a[i-1]) a[++ta] = a[i]; } rtpos[0] = build(1,ta); for(int i=1;i<=n;i++){ int pos = lower_bound(a+1,a+ta+1,b[i]) - a; rtpos[i] = update(rtpos[i-1],1,ta,pos); } while(m--){ int l,r,k; scanf("%d %d %d",&l,&r,&k); int cc = get_kth(rtpos[l-1],rtpos[r],1,ta,k); printf("%d\n",a[cc]); } }
int main() { int ca; cin >> ca; while(ca--){ solve(); }
return 0;
}
|