1 #include <bits/stdc++.h> 2 #define read read() 3 #define up(i,l,r) for(int i = (l);i <= (r);i++) 4 using namespace std; 5 int read 6 { 7 int x = 0,f = 1; char ch = getchar(); 8 while(ch < 48 || ch > 57) {if(ch == '-') f = -1; ch = getchar();} 9 while(ch >=48 && ch <=57) {x = 10 * x + ch - 48; ch = getchar();} 10 return x * f; 11 } 12 const int N = 2e5+7; 13 struct a 14 { 15 int l,r,sum; 16 }node[N*25]; 17 int n,m,cnt,a[N],root[N]; 18 vector<int> v; 19 int Get_id(int x) {return lower_bound(v.begin(),v.end(),x) - v.begin() + 1;} 20 void update(int l,int r,int &cur,int pre,int pos) 21 { 22 node[++cnt] = node[pre],node[cnt].sum++,cur = cnt; 23 if(l==r) return; 24 int mid = (l+r)>>1; 25 if(pos<=mid) update(l,mid,node[cur].l,node[pre].l,pos); 26 else update(mid+1,r,node[cur].r,node[pre].r,pos); 27 } 28 int query(int l,int r,int x,int y,int k) 29 { 30 if(l==r) return l; 31 int mid = (l+r)>>1; 32 int lsum = node[node[y].l].sum - node[node[x].l].sum; 33 if(lsum>=k) return query(l,mid,node[x].l,node[y].l,k); 34 else return query(mid+1,r,node[x].r,node[y].r,k-lsum); 35 } 36 int main() 37 { 38 freopen("input.txt","r",stdin); 39 n = read; m = read; 40 int l,r,k; 41 up(i,1,n) a[i] = read,v.push_back(a[i]); 42 sort(v.begin(),v.end()); 43 v.erase(unique(v.begin(),v.end()),v.end()); 44 up(i,1,n) update(1,n,root[i],root[i-1],Get_id(a[i])); 45 up(i,1,m) 46 { 47 l = read; r = read; k = read; 48 printf("%d ",v[query(1,n,root[l-1],root[r],k)-1]); 49 } 50 return 0; 51 }