1 /*
2 题意:查询区间第K大
3 题解:主席树
4 时间:
5 */
6
7 #include <bits/stdc++.h>
8 using namespace std;
9
10 typedef long long LL;
11 const int MAXN = 100005;
12 const LL MOD7 = 1e9+7;
13
14 struct TreeNode
15 {
16 int sum;
17 int lson,rson;
18 }tree[MAXN<<5];
19 int cnt;
20
21 int root[MAXN],a[MAXN],num[MAXN];
22 int n,Q;
23
24 int newNode(int sum,int lson,int rson)
25 {
26 ++cnt;
27 tree[cnt].sum=sum;
28 tree[cnt].lson=lson;
29 tree[cnt].rson=rson;
30 return cnt;
31 }
32
33 void Insert(int &root,int pre,int pos,int L,int R)
34 {
35 root=newNode(tree[pre].sum+1,tree[pre].lson,tree[pre].rson);
36 if (L==R) return;
37 int mid=(L+R)/2;
38 if (pos<=mid) Insert(tree[root].lson,tree[pre].lson,pos,L,mid);
39 else Insert(tree[root].rson,tree[pre].rson,pos,mid+1,R);
40 }
41
42 int query(int S,int E,int L,int R,int K)
43 {
44 if (L==R) return L;
45 int sum = tree[tree[E].lson].sum-tree[tree[S].lson].sum;
46 int mid=(L+R)/2;
47 if (K<=sum) return query(tree[S].lson,tree[E].lson,L,mid,K);
48 else return query(tree[S].rson,tree[E].rson,mid+1,R,K-sum);
49 }
50
51 int main()
52 {
53 #ifndef ONLINE_JUDGE
54 freopen("test.txt","r",stdin);
55 #endif // ONLINE_JUDGE
56 int Case;
57 scanf("%d",&Case);
58 while (Case--)
59 {
60 scanf("%d%d",&n,&Q);
61 for (int i=1;i<=n;++i)
62 {
63 scanf("%d",&a[i]);
64 num[i]=a[i];
65 }
66 sort(num+1,num+1+n);
67 int nums=unique(num+1,num+1+n)-(num+1);
68 root[0]=0;cnt=0;
69 for (int i=1;i<=n;++i)
70 {
71 int pos=lower_bound(num+1,num+1+nums,a[i]) - (num+1) + 1;
72 // printf("pos=%d\n",pos);
73 Insert(root[i],root[i-1],pos,1,n);
74 }
75 int x,y,K;
76 for (int i=1;i<=Q;++i)
77 {
78 scanf("%d%d%d",&x,&y,&K);
79 printf("%d\n",num[query(root[x-1],root[y],1,n,K)]);
80 }
81 }
82 return 0;
83 }