P3834主席树求条
查看原帖
P3834主席树求条
494598
him的自我修养楼主2024/11/30 14:59
#include <bits/stdc++.h>
using namespace std;
const int N=2e5+10;
int n,q,cnt,sum[N<<5],a[N],b[N],ls[N<<5],rs[N<<5],rt[N<<5];
int build(int l,int r){
	int root=++cnt;
	if(l==r){
		return root;
	}
	int mid=(l+r)/2;
	ls[root]=build(1,mid);
	rs[root]=build(mid+1,r);
	return root;
}
int upd(int l,int r,int root,int k){
	int nwroot=++cnt;
	ls[nwroot]=ls[root];
	rs[nwroot]=rs[root];
	sum[nwroot]=sum[root]+1;
	if(l==r){
		return nwroot;
	}
	int mid=(l+r)/2;
	if(k<=mid){
		ls[nwroot]=upd(l,mid,ls[nwroot],k);
	}else{
		rs[nwroot]=upd(mid+1,r,rs[nwroot],k);
	}
	return nwroot;
}
int query(int fl,int fr,int l,int r,int k){
	int x=sum[ls[fr]]-sum[ls[fl]];
	if(l==r){
		return l;
	}
	int mid=(l+r)/2; 
	if(k<=x){
		return query(ls[fl],ls[fr],l,mid,k);
	}else{
		return query(rs[fl],rs[fr],mid+1,r,k-x);
	}
}
int main(){
	cin >>n>>q;
	for(int i=1;i<=n;i++){
		cin >>a[i];
		b[i]=a[i];
	}
	sort(b+1,b+n+1);
	int len=unique(b+1,b+n+1)-b-1;
	rt[0]=build(1,len);
	for(int i=1;i<=n;i++){
		int x=lower_bound(b+1,b+len+1,a[i])-b;
		rt[i]=upd(1,len,rt[i-1],x);
	}
	while(q--){
		int l,r,k;
		cin >>l>>r>>k;
		cout <<b[query(rt[l-1],rt[r],1,len,k)]<<endl;
	}
	return 0;
}
2024/11/30 14:59
加载中...