题目: https://www.luogu.org/problem/P3834
分析:
此题为主席树模板题
代码:
#include <bits/stdc++.h>
using namespace std;
const int tmax=2e5+5;
int n,m,cnt;
int a[tmax],T[tmax];
int sum[tmax<<5],ls[tmax<<5],rs[tmax<<5];
set<int> SET;
map<int,int> rrank,who;
int build(int l,int r)
{
int root=++cnt;
sum[root]=0;
int mid=(l+r)>>1;
if(l<r)
{
ls[root]=build(l,mid);
rs[root]=build(mid+1,r);
}
return root;
}
int update(int pre,int l,int r,int x)
{
int root=++cnt;
ls[root]=ls[pre];
rs[root]=rs[pre];
sum[root]=sum[pre]+1;
int mid=(l+r)>>1;
if(l<r)
{
if(x<=mid)
ls[root]=update(ls[pre],l,mid,x);
else
rs[root]=update(rs[pre],mid+1,r,x);
}
return root;
}
int query(int u,int v,int l,int r,int k)
{
if(l>=r)
return l;
int num=sum[ls[v]]-sum[ls[u]];
int mid=(l+r)>>1;
if(num>=k)
return query(ls[u],ls[v],l,mid,k);
else
return query(rs[u],rs[v],mid+1,r,k-num);
}
int main()
{
int q,ll,rr,k;
scanf("%d%d",&n,&q);
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
SET.insert(a[i]);
}
for(set<int>::iterator iter=SET.begin();iter!=SET.end();iter++)
{
rrank[*iter]=++m;
who[m]=*iter;
}
T[0]=build(1,m);
for(int i=1;i<=n;i++)
T[i]=update(T[i-1],1,m,rrank[a[i]]);
while(q--)
{
scanf("%d%d%d",&ll,&rr,&k);
int tmp=query(T[ll-1],T[rr],1,m,k);
printf("%d\n",who[tmp]);
}
return 0;
}