求助,定给您点关注
查看原帖
求助,定给您点关注
421128
Addrian楼主2022/8/18 17:27
#include<iostream>
#include<algorithm>
using namespace std;
const int N=2e5+50;
struct node{
	int l,r,jgs;
}tree[N*30];
int q[N],bh[N],a[N],giao,qian,b[N];
int top,root[N],gs,gz,i1;
int n,m;
int l1,r1,k1,daan;
//
int build(int l,int r,int n){
	int n1;
	tree[++top]=tree[n];
	n1=top;
	if(l==r){
		tree[n1].jgs++;
		return n1;//返回根 
	}else{
		int mid=(l+r)/2;
		if(a[i1]<=mid)tree[n1].l=build(l,mid,tree[n].l);
		if(a[i1]>mid)tree[n1].r=build(mid+1,r,tree[n].r);
		tree[n1].jgs++;
		return n1;
	}
}
//
int cha(int n1,int n2,int l,int r,int k)
{
    if(l>=r){
		return-1;
	}
    int chazhi=tree[n1].jgs-tree[n2].jgs;
    int mid=(l+r)/2;
    if(chazhi>=k){
		return cha(tree[n1].l,tree[n2].l,l,mid,k);
	}else{
		return cha(tree[n1].r,tree[n2].r,mid+1,r,k-chazhi);
	}
}
//
int px(int a,int b){
	if(q[a]<q[b]){
		return a<b;
	}else{
		return b<a;
	}
}
int main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		cin>>q[i];
		bh[i]=i;
	}
	sort(bh+1,bh+1+n,px);
	qian=q[bh[1]]-1;
	for(int i=1;i<=n;i++){
		if(qian!=q[bh[i]]){
			giao++;
		}
		a[bh[i]]=giao;
		b[giao]=q[bh[i]];
	}
	for(int i=1;i<=n;i++){
		i1=i;
		gz=build(1,giao,root[i-1]);
		root[i]=gz;
	}
	//cout<<"giao";
	for(int i=1;i<=m;i++){
		cin>>l1>>r1>>k1;
		if(l1==r1&&k1==1){
			cout<<q[l1]<<endl;
		}else{
			daan=cha(root[r1],root[l1-1],1,giao,k1);
			cout<<b[daan]<<endl;
		}
	}
	return 0;
} 
2022/8/18 17:27
加载中...