主席树模板复习。。。。
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<iostream>
#define fo(i,a,b) for(int i=a;i<=b;i++)
#define fd(i,a,b) for(int i=a;i>=b;i--)
using namespace std;
int n,m,q;
typedef long long ll;
const int N=1e6;
int a[N],b[N],tot=0,root[N],rank[N];
struct node
{
int l,r,s;
}t[N*5];
inline void insert(int &x,int y,int p,int l,int r)
{
x=++tot;
t[x].s=t[y].s+1;
t[x].l=t[y].l;
t[x].r=t[y].r;
if (l==r)return;
int mid=(l+r)/2;
if (p<=mid)insert(t[x].l,t[y].l,p,l,mid);
else insert(t[x].r,t[y].r,p,mid+1,r);
}
inline int find(int x)
{
int l=1,r=n;
while (l<=r)
{
int mid=(l+r)/2;
if (x==b[mid])return mid;
else if (x<b[mid])r=mid-1;
else l=mid+1;
}
}
inline void build(int &d,int l,int r)
{
d=++tot;
t[d].s=0;
if (l==r)return;
int mid=(l+r)/2;
build(t[d].l,l,mid);
build(t[d].r,mid+1,r);
}
inline int query(int x,int y,int k,int l,int r)
{
if (l==r)return l;
int res=t[t[y].l].s-t[t[x].l].s;
int mid=(l+r)/2;
if (res>=k)return query(t[x].l,t[y].l,k,l,mid);
else return query(t[x].r,t[y].r,k-res,mid+1,r);
}
int main()
{
scanf("%d%d",&n,&q);
fo(i,1,n)scanf("%d",&a[i]),b[i]=a[i];
sort(b+1,b+1+n);
fo(i,1,n)
rank[i]=find(a[i]);
build(root[0],1,n);
fo(i,1,n)
insert(root[i],root[i-1],rank[i],1,n);
fo(i,1,q)
{
int x,y,z;
scanf("%d%d%d",&x,&y,&z);
printf("%d\n",b[query(root[x-1],root[y],z,1,n)]);
}
}