求助,定给您点关注!
查看原帖
求助,定给您点关注!
421128
Addrian楼主2022/8/18 16:07

样例没过

#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,k,sum,daan;
//
int build(int l,int r,int n){
	tree[++top]=tree[n];
	n=top;
	if(l==r){
		tree[n].jgs++;
		return n;//返回根 
	}else{
		int mid=(l+r)/2;
		if(a[i1]<=mid)tree[n].l=build(l,mid,tree[n].l);
		if(a[i1]>mid)tree[n].r=build(mid+1,r,tree[n].r);
		tree[n].jgs++;
		return n;
	}
}
//
int xj(int l,int r,int n1,int n2){
	tree[++top]=tree[n];
	n=top;
	if(l==r){
		tree[n].jgs=tree[n1].jgs-tree[n2].jgs;
		//cout<<"giao"<<tree[n].jgs;
		return n;
	}else{
		int mid=(l+r)/2;
		tree[n].l=xj(l,mid,tree[n1].l,tree[n2].l);
		tree[n].r=xj(mid+1,r,tree[n1].r,tree[n2].r);
		tree[n].jgs=tree[tree[n].l].jgs+tree[tree[n].r].jgs;
		//cout<<"giao"<<tree[n].jgs;
		return n;
	}
}
//
int cha(int l,int r,int n){
	int mid=(l+r)/2;
	int he=sum+tree[tree[n].l].jgs;
	if(he>k){
		//cout<<"giao1";
		cha(l,mid,tree[n].l);
	}else if(he==k){
		//cout<<"giao2";
		return mid;
	}else{
		//cout<<"giao3";
		sum=he;
		cha(mid+1,r,tree[n].r);
	}
}
//
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>>k;
		if(l1==r1&&k==1){
			q[l1];
			cout<<q[l1]<<endl;
		}else{
			sum=0;
			gz=xj(1,giao,root[r1],root[l1-1]);
			//cout<<"giao";
			daan=cha(1,giao,gz);
			cout<<b[daan]<<endl;
		}
	}
	return 0;
} 
2022/8/18 16:07
加载中...