1 #include<bits/stdc++.h>
2 using namespace std;
3 const int N=200011,M=N<<5;
4 int n,m,a[N],b[N],num,tot,rt[N];
5 int cnt[M],ch[M][2];
6
7 inline int re_ad() {
8 char ch=getchar(); int x=0,f=1;
9 while(ch<'0' || ch>'9') { if(ch=='-') f=-1; ch=getchar(); }
10 while('0'<=ch && ch<='9') x=(x<<1)+(x<<3)+ch-'0',ch=getchar();
11 return x*f;
12 }
13
14 inline void pushup(int d) {
15 cnt[d]=cnt[ch[d][0]]+cnt[ch[d][1]];
16 }
17
18 int build(int l,int r) {
19 int d=++tot;
20 if(l==r) return d;
21 int mid=(l+r)>>1;
22 ch[d][0]=build(l,mid);
23 ch[d][1]=build(mid+1,r);
24 return d;
25 }
26
27 int update(int p,int l,int r,int k) {
28 int d=++tot;
29 if(l==r) {
30 cnt[d]=cnt[p]+1;
31 return d;
32 }
33 int mid=(l+r)>>1;
34 ch[d][0]=ch[p][0],ch[d][1]=ch[p][1];
35 if(k<=mid) ch[d][0]=update(ch[p][0],l,mid,k);
36 else ch[d][1]=update(ch[p][1],mid+1,r,k);
37 pushup(d);
38 return d;
39 }
40
41 int query(int p,int d,int l,int r,int k) {
42 if(l==r) return l;
43 int cur=cnt[ch[d][0]]-cnt[ch[p][0]];
44 int mid=(l+r)>>1;
45 if(cur>=k) return query(ch[p][0],ch[d][0],l,mid,k);
46 else return query(ch[p][1],ch[d][1],mid+1,r,k-cur);
47 }
48
49 int main()
50 {
51 int x,y,z,k;
52 n=re_ad(),m=re_ad();
53 for(int i=1;i<=n;++i) b[i]=a[i]=re_ad();
54 sort(b+1,b+n+1);
55 num=unique(b+1,b+n+1)-b-1;
56 for(int i=1;i<=n;++i) a[i]=lower_bound(b+1,b+num+1,a[i])-b;
57 rt[0]=build(1,num);
58 for(int i=1;i<=n;++i) rt[i]=update(rt[i-1],1,num,a[i]);
59 for(int i=1;i<=m;++i) {
60 x=re_ad(),y=re_ad(),k=re_ad();
61 z=query(rt[x-1],rt[y],1,num,k);
62 printf("%d\n",b[z]);
63 }
64 return 0;
65 }