#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+5;
int t,n,m;
int tot;
int ver[maxn];
struct st{
int l,r,sum;
}tre[maxn<<5];
int build(int l,int r){
int root=++tot;
tre[root].l =root;
tre[root].r =root;
tre[root].sum =0;
return root;
}
int change(int node,int l,int r,int x){
int root=++tot;
st &rt=tre[root];
rt=tre[node];
rt.sum +=1;
if(l==r) return root;
int mid=(l+r)>>1;
if(x<=mid) rt.l =change(rt.l ,l,mid,x);
else rt.r =change(rt.r ,mid+1,r,x);
return root;
}
int query(int t1,int t2,int l,int r,int k){
if(l==r) return l;
st &s1=tre[t1];
st &s2=tre[t2];
int x=tre[s2.l ].sum -tre[s1.l ].sum ;
int mid=(l+r)>>1;
if(x>=k) return query(s1.l ,s2.l ,l,mid,k);
else return query(s1.r ,s2.r ,mid+1,r,k-x);
}
int main()
{
int a,ll,rr,kk;
scanf("%d",&t);
while(t--){
scanf("%d%d",&n,&m);
tot=0;
ver[0]=build(1,n);
for(int i=1;i<=n;i++){
scanf("%d",&a);
ver[i]=change(ver[i-1],1,n,a);
}
for(int i=0;i<m;i++){
scanf("%d%d%d",&ll,&rr,&kk);
printf("%d\n",query(ver[ll-1],ver[rr],1,n,kk));
}
}
return 0;
}
可持久线段树(主席树)模板
最新推荐文章于 2024-06-12 10:00:23 发布