分块求助
查看原帖
分块求助
984450
zhoujinhong楼主2024/9/19 00:11
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=200010,T=510;
int n,q,a[N],l,r,x,ans,t,L[T],R[T],pos[N],sum[T][T];
vector<int>ve[T];
int query(int x,int y,int val){
	int px=pos[x],py=pos[y],ans=0;
	if(px==py){
		for(int i=x;i<=y;i++){
			if(a[i]<=val) ans+=a[i];
		}
		return ans;
	}
	else{
		for(int i=px+1;i<=py-1;i++){
			if(ve[i][0]>val) continue;
			if(ve[i][ve[i].size()-1]<=val) ans+=sum[i][ve[i].size()-1];
			else ans+=sum[i][upper_bound(ve[i].begin(),ve[i].end(),val)-ve[i].begin()-1];
		}
		for(int i=x;i<=R[px];i++){
			if(a[i]<=val) ans+=a[i];
		}
		for(int i=L[py];i<=y;i++){
			if(a[i]<=val) ans+=a[i];
		}
		return ans;
	}
}
signed main(){
	ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
	cin>>n;
	t=sqrt(n);
	for(int i=1;i<=n;i++) cin>>a[i];
	for(int i=1;i<=t;i++) L[i]=R[i-1]+1,R[i]=L[i]+t-1;
	if(R[t]<n) L[++t]=R[t-1]+1,R[t]=n;
	for(int i=1;i<=t;i++){
		for(int j=L[i];j<=R[i];j++) ve[i].push_back(a[j]),pos[j]=i;
		sort(ve[i].begin(),ve[i].end());	
		sum[i][0]=ve[i][0];
		for(int j=1;j<ve[i].size();j++) sum[i][j]=sum[i][j-1]+ve[i][j];
	}
	cin>>q;
	for(int i=1;i<=q;i++){
		cin>>l>>r>>x;
		l^=ans,r^=ans,x^=ans;
		ans=query(l,r,x);
		cout<<ans<<'\n';
	}
	return 0;
} 
2024/9/19 00:11
加载中...