求助RE 5分块
查看原帖
求助RE 5分块
691641
Grow_楼主2024/10/8 10:41

我是莱德同学,我需要莱德!

#include<bits/stdc++.h>
using namespace std;
int n,q,a[1000005];
int bk[1000005],S;
int l[1005],r[1005];
long long sm[1000005];
int b[1000005];
long long x,y,z,ans;
int find(int x,int c){
	int lx = l[x],rx = r[x];
	while(lx<rx){
		int mid = (lx+rx+1)/2;
		if(b[mid]<=c)lx = mid;
		else rx = mid-1;
	}
	return sm[rx];
}
signed main(){
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	cin >> n;
	S = 1200;
	int last = 0;
	for(int i = 1;i<=n;i++){
		bk[i] = (i-1)/S+1;
		if(bk[i]!=last){
			last = bk[i];
			l[bk[i]] = i;
			r[bk[i]-1] = i-1;
		}
	}
	r[bk[n]] = n;
	for(int i = 1;i<=n;i++){
		cin >> a[i];
		b[i] = a[i];
	}
	for(int i = 1;i<=bk[n];i++){
		sort(b+l[i],b+r[i]+1);
	}
	for(int i = 1;i<=n;i++){
		sm[i] = sm[i-1]+b[i];
		if(i==l[bk[i]])sm[i] = b[i];
	}
	cin >> q;
	while(q--){
		cin >> x >> y >> z;
		x^=ans;
		y^=ans;
		z^=ans;
		ans = 0;
		if(bk[x]==bk[y]){
			for(int i = x;i<=y;i++)if(a[i]<=z)ans+=a[i];
		}
		else{
			for(int i = x;i<=r[bk[x]];i++)if(a[i]<=z)ans+=a[i];
			for(int i = l[bk[y]];i<=y;i++)if(a[i]<=z)ans+=a[i];
			for(int i = bk[x]+1;i<=bk[y]-1;i++)ans+=find(i,z);
		}
		cout << ans << "\n";
	}
	return 0;
}
2024/10/8 10:41
加载中...