#include<iostream>
#include<cstdio>
#include<algorithm>
#include<vector>
typedef int LL; //Attention!!
using namespace std;
const int M = 1000000007;
struct point{
LL xx;LL yy;LL zz;
bool const operator < (const point &b)
const {
return xx < b.xx;
}
};
bool myfun(const point& a,const point& b)
{
return a.yy < b.yy;
}
const int N = 1000001;
LL tree[N],L[N],R[N];
LL next;
vector <point> v;
void build(LL ID,LL l,LL r)
{
tree[ID] = 0;
LL m = (l+r)>>1;
if(l<r)
{
L[ID] = next++;
build(L[ID],l,m);
R[ID] = next++;
build(R[ID],m+1,r);
}
else
{L[ID] = -1;R[ID] = -1;}
}
void update(LL ID,LL id,LL l,LL r,LL loc) //new ID and old id
{
LL m = (l+r)>>1;
if(l==r)
{
tree[ID] = 1;
return;
}
L[ID] = L[id];
R[ID] = R[id];
if(l<=loc && loc<=m)
{L[ID] = next++;
update(L[ID],L[id],l,m,loc);
}
if((m+1)<=loc && loc<=r)
{R[ID] = next++;
update(R[ID],R[id],m+1,r,loc);
}
tree[ID] = tree[L[ID]] + tree[R[ID]];
}
LL get(LL id,LL ID,LL k,LL l,LL r)
{
if(l==r) return v[l].xx;
LL mid = (l+r)>>1;
//cout<<tree[L[ID]] - tree[L[id]]<<' '<<k<<' '<<l<<' '<<r<<endl;
if(tree[L[ID]]-tree[L[id]] >= k)
return get(L[id],L[ID],k,l,mid);
else
return get(R[id],R[ID],k-(tree[L[ID]]-tree[L[id]]),mid+1,r);
}
int main()
{
LL n,i,j,m;
cin>>n>>m;
v.resize(n);
for(i=0;i<n;i++)
{cin>>v[i].xx;
v[i].yy = i;
}
sort(v.begin(),v.end());
for(i=0;i<n;i++)
v[i].zz = i;
sort(v.begin(),v.end(),myfun);
next = 2;
build(1,0,n-1);
vector <LL> ind(n+1);
ind[0] = 1;
for(i=1;i<=n;i++)
{
ind[i] = next++;
update(ind[i],ind[i-1],0,n-1,v[i-1].zz);
//ID and then location
}//we set original v[i]'s position in sorted as 1
LL a,b,c;
sort(v.begin(),v.end());
for(i=0;i<m;i++)
{
cin>>a>>b>>c;
a--;
cout<<get(ind[a],ind[b],c,0,n-1)<<endl;
}
}
CiNpbmNsdWRlPGlvc3RyZWFtPgojaW5jbHVkZTxjc3RkaW8+CiNpbmNsdWRlPGFsZ29yaXRobT4KI2luY2x1ZGU8dmVjdG9yPgoKdHlwZWRlZiBpbnQgTEw7ICAvL0F0dGVudGlvbiEhCnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgogCgpjb25zdCBpbnQgTSA9IDEwMDAwMDAwMDc7CgpzdHJ1Y3QgcG9pbnR7CkxMIHh4O0xMIHl5O0xMIHp6OwoKYm9vbCBjb25zdCBvcGVyYXRvciA8IChjb25zdCBwb2ludCAmYikKY29uc3QgewpyZXR1cm4geHggPCBiLnh4Owp9Cn07Cgpib29sIG15ZnVuKGNvbnN0IHBvaW50JiBhLGNvbnN0IHBvaW50JiBiKQp7CnJldHVybiBhLnl5IDwgYi55eTsKfQoKY29uc3QgaW50IE4gPSAxMDAwMDAxOwpMTCB0cmVlW05dLExbTl0sUltOXTsKTEwgbmV4dDsKdmVjdG9yIDxwb2ludD4gdjsKCgp2b2lkIGJ1aWxkKExMIElELExMIGwsTEwgcikKewp0cmVlW0lEXSA9IDA7CkxMIG0gPSAobCtyKT4+MTsKCmlmKGw8cikKewpMW0lEXSA9IG5leHQrKzsKYnVpbGQoTFtJRF0sbCxtKTsKUltJRF0gPSBuZXh0Kys7CmJ1aWxkKFJbSURdLG0rMSxyKTsKfQplbHNlCgl7TFtJRF0gPSAtMTtSW0lEXSA9IC0xO30KfQoKdm9pZCB1cGRhdGUoTEwgSUQsTEwgaWQsTEwgbCxMTCByLExMIGxvYykgIC8vbmV3IElEIGFuZCBvbGQgaWQKewpMTCBtID0gKGwrcik+PjE7CgppZihsPT1yKQoJewoJdHJlZVtJRF0gPSAxOwoJcmV0dXJuOwkKCX0KCkxbSURdID0gTFtpZF07ClJbSURdID0gUltpZF07CgppZihsPD1sb2MgJiYgbG9jPD1tKQoJe0xbSURdID0gbmV4dCsrOwoJdXBkYXRlKExbSURdLExbaWRdLGwsbSxsb2MpOwoJfQppZigobSsxKTw9bG9jICYmIGxvYzw9cikKCXtSW0lEXSA9IG5leHQrKzsKCXVwZGF0ZShSW0lEXSxSW2lkXSxtKzEscixsb2MpOwkKCX0KdHJlZVtJRF0gPSB0cmVlW0xbSURdXSArIHRyZWVbUltJRF1dOwoKfQoKTEwgZ2V0KExMIGlkLExMIElELExMIGssTEwgbCxMTCByKQp7CmlmKGw9PXIpIHJldHVybiB2W2xdLnh4OwoKTEwgbWlkID0gKGwrcik+PjE7CgovL2NvdXQ8PHRyZWVbTFtJRF1dIC0gdHJlZVtMW2lkXV08PCcgJzw8azw8JyAnPDxsPDwnICc8PHI8PGVuZGw7CgppZih0cmVlW0xbSURdXS10cmVlW0xbaWRdXSA+PSBrKSAKCQlyZXR1cm4gZ2V0KExbaWRdLExbSURdLGssbCxtaWQpOwplbHNlCQoJCXJldHVybiBnZXQoUltpZF0sUltJRF0say0odHJlZVtMW0lEXV0tdHJlZVtMW2lkXV0pLG1pZCsxLHIpOwp9CgoKaW50IG1haW4oKQp7CkxMIG4saSxqLG07CgpjaW4+Pm4+Pm07Cgp2LnJlc2l6ZShuKTsKCmZvcihpPTA7aTxuO2krKykKCXtjaW4+PnZbaV0ueHg7Cgl2W2ldLnl5ID0gaTsJCgl9CQoKc29ydCh2LmJlZ2luKCksdi5lbmQoKSk7Cgpmb3IoaT0wO2k8bjtpKyspCgl2W2ldLnp6ID0gaTsKCnNvcnQodi5iZWdpbigpLHYuZW5kKCksbXlmdW4pOwoKbmV4dCA9IDI7CgpidWlsZCgxLDAsbi0xKTsKCnZlY3RvciA8TEw+IGluZChuKzEpOwppbmRbMF0gPSAxOwoKZm9yKGk9MTtpPD1uO2krKykKCXsKCWluZFtpXSA9IG5leHQrKzsJCgl1cGRhdGUoaW5kW2ldLGluZFtpLTFdLDAsbi0xLHZbaS0xXS56eik7CgkJLy9JRCBhbmQgdGhlbiBsb2NhdGlvbgoJfS8vd2Ugc2V0IG9yaWdpbmFsIHZbaV0ncyBwb3NpdGlvbiBpbiBzb3J0ZWQgYXMgMQoKTEwgYSxiLGM7Cgpzb3J0KHYuYmVnaW4oKSx2LmVuZCgpKTsKCmZvcihpPTA7aTxtO2krKykKCXsKCWNpbj4+YT4+Yj4+YzsKCWEtLTsKCWNvdXQ8PGdldChpbmRbYV0saW5kW2JdLGMsMCxuLTEpPDxlbmRsOwkKCX0KCn0KCg==