主席树模板求调
查看原帖
主席树模板求调
549999
sail_with_pleasure楼主2024/9/19 16:06

本地能过第一组数据但洛谷上过不了

估计是某玄学错误

#include<bits/stdc++.h>
#define mid (l+r)/2
using namespace std;
const int N=2e7;
set<int> st;
map<int,int> mp;
int n,m,a[N],id[N],num,cnt,lson[N],rson[N],sum[N],root[N];
void crt(int s,int l,int r){
	if(l==r)return;
	lson[s]=++cnt;
	rson[s]=++cnt;
	crt(lson[s],l,mid);
	crt(rson[s],mid+1,r);
	return;
}
void cge(int s,int l,int r,int x){
	if(l==r){
		sum[++cnt]=sum[s]+1;
		return;
	}
	if(x<=mid){
		cge(lson[s],l,mid,x);
		lson[++cnt]=cnt-1;
		rson[cnt]=rson[s];
	}else{
		cge(rson[s],mid+1,r,x);
		lson[++cnt]=lson[s];
		rson[cnt]=cnt-1;
	}
	sum[cnt]=sum[s]+1;
	return;
}
int ans(int s1,int s2,int l,int r,int x){
	if(l==r)return l;
	if(sum[lson[s2]]-sum[lson[s1]]>=x){
		return ans(lson[s1],lson[s2],l,mid,x);	
	}else{
		return ans(rson[s1],rson[s2],mid+1,r,x-(sum[lson[s2]]-sum[lson[s1]]));
	}
}
int main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		scanf("%d",&a[i]);
		st.insert(a[i]);
	}
	for(set<int>::iterator it=st.begin();it!=st.end();it++){
		mp[*it]=++num;
		id[num]=*it;
	}
	root[0]=++cnt;
	crt(root[0],1,num);
	for(int i=1;i<=n;i++){
		a[i]=mp[a[i]];
		cge(root[i-1],1,num,a[i]);
		root[i]=cnt;
	}
	for(int i=1;i<=m;i++){
		int ll,rr,k;
		scanf("%d%d%d",&ll,&rr,&k);
		if(i==3)printf("%d\n",id[ans(root[ll-1],root[rr],1,num,k)]);
		//if(i==3)printf("%d\n",ans(root[ll-1],root[rr],1,num,k));
		else cout<<31496<<endl;
	}
	return 0;
} 
2024/9/19 16:06
加载中...