#include<bits/stdc++.h> using namespace std; const int MAXN =(int)1e5+5; struct node{ int vl,l,r; }T[MAXN*40]; vector<int>v; int a[MAXN],cnt,root[MAXN]; void insert(int l,int r,int &x,int y,int pos){ x=++cnt;T[x]=T[y]; T[x].vl++; if(l==r)return ; int mid=l+r>>1; if(mid>=pos)insert(l,mid,T[x].l,T[y].l,pos); else insert(mid+1,r,T[x].r,T[y].r,pos); } int query(int l,int r,int x,int y,int k){ if(l==r)return l; int sum=T[T[y].l].vl-T[T[x].l].vl; int mid=l+r>>1; if(sum>=k)return query(l,mid,T[x].l,T[y].l,k); else return query(mid+1,r,T[x].r,T[y].r,k-sum); } int main() { int t; scanf("%d",&t); while(t--){ v.clear(); cnt=0; int n,m; scanf("%d%d",&n,&m); for(int i=1;i<=n;i++){ scanf("%d",&a[i]); v.push_back(a[i]); } sort(v.begin(),v.end()); v.erase(unique(v.begin(),v.end()),v.end()); int vsz=v.size(); for(int i=1;i<=n;i++){ a[i]=lower_bound(v.begin(),v.end(),a[i])-v.begin()+1; insert(1,vsz,root[i],root[i-1],a[i]); } while(m--){ int l,r,k; scanf("%d%d%d",&l,&r,&k); printf("%d\n",v[query(1,vsz,root[l-1],root[r],k)-1]); } } return 0; }