#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
struct node1
{
int ls,rs;
int sum;
}t[3000000];
int tot;
int build(int l,int r)
{
int k=tot++;
if(l==r)
{
t[k].sum=0;
return k;
}
int m=(l+r)>>1;
t[k].ls=build(l,m);
t[k].rs=build(m+1,r);
t[k].sum=t[t[k].ls].sum+t[t[k].rs].sum;
return k;
}
int update(int pre,int pos,int l,int r)
{
int k=tot++;
t[k]=t[pre];
if(l==pos&&r==pos)
{
t[k].sum++;
return k;
}
int m=(l+r)>>1;
if(pos<=m)
t[k].ls=update(t[pre].ls,pos,l,m);
else
t[k].rs=update(t[pre].rs,pos,m+1,r);
t[k].sum=t[t[k].ls].sum+t[t[k].rs].sum;
return k;
}
int query(int l,int r,int a,int b,int k)
{
if(l==r)
return l;
int m=(l+r)>>1;
int tem=t[t[b].ls].sum-t[t[a].ls].sum;
if(k<=tem)
return query(l,m,t[a].ls,t[b].ls,k);
else
return query(m+1,r,t[a].rs,t[b].rs,k-tem);
}
struct node2
{
int x,idx;
}d[100010];
int lo[100100];
int rt[100010];
bool cmp(const struct node2 &a,const struct node2 &b)
{
return a.x<b.x;
}
int main()
{
int n,q;
scanf("%d%d",&n,&q);
for(int i=1;i<=n;i++)
{
scanf("%d",&d[i].x);
d[i].idx=i;
}
tot=0;
sort(d+1,d+n+1,cmp);
for(int i=1;i<=n;i++)
lo[d[i].idx]=i;
rt[0]=build(1,n);
for(int i=1;i<=n;i++)
rt[i]=update(rt[i-1],lo[i],1,n);
while(q--)
{
int a,b,k;
scanf("%d%d%d",&a,&b,&k);
int tem=query(1,n,rt[a-1],rt[b],k);
printf("%d\n",d[tem].x);
}
}
poj 2104 主席树
最新推荐文章于 2021-09-22 17:20:36 发布