半红求助
查看原帖
半红求助
597119
HouSibo楼主2024/4/5 21:47
#include<bits/stdc++.h>
using namespace std;
long long tot,n,m;
long long sum[500010],rt[200010],ls[500010],rs[500010];
long long a[200010],ind[200010],len;
long long getid(const int &val) {
	return lower_bound(ind+1,ind+len+1,val)-ind;
}
long long maketree(long long l,long long r){
	long long root=++tot;
	if(l==r){
		return root;
	}
	int mid=(l+r)/2;
	ls[root]=maketree(l,mid);
	rs[root]=maketree(mid+1,r);
	return root;
}
long long update(long long k,long long l,long long r,long long root){
	long long dir=++tot;
	ls[dir]=ls[root];
	rs[dir]=rs[root];
	sum[dir]=sum[root]+1;
	if(l==r){
		return dir;
	}
	long long mid=(l+r)/2;
	if(k<=mid){
		ls[dir]=update(k,l,mid,ls[dir]);
	}else{
		rs[dir]=update(k,mid+1,r,rs[dir]);
	}
	return dir;
}
long long query(long long u,long long v,long long l,long long r,long long k) {
	long long mid=(l+r)/2;
	long long x=sum[ls[v]]-sum[ls[u]];
	if(l==r){
		return l;
	}
	if(k<=x){
		return query(ls[u],ls[v],l,mid,k);
	}else{
		return query(rs[u],rs[v],mid+1,r,k-x);
	}	
}
int main() {
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		cin>>a[i];
	}
	memcpy(ind,a,sizeof(ind));
	sort(ind+1,ind+n +1);
	len=unique(ind+1,ind+n+1)-ind-1;
	rt[0]=maketree(1, len);
	for(long long i=1;i<=n;i++){
		rt[i]=update(getid(a[i]),1,len,rt[i-1]);
	}
	while(m--){
		long long l,r,k;
		cin>>l>>r>>k;
		cout<<ind[query(rt[l-1],rt[r],1,len,k)]<<endl;
	}
	return 0;
}

WA了后面五个点

2024/4/5 21:47
加载中...