学分块
查看原帖
学分块
744562
Aya_tt楼主2022/8/9 10:48
#include<bits/stdc++.h>
using namespace std;
const int N = 114514;
long long cnt,n,m,a[N],cn[N],lazy[N],sum[N];
void update(long long x,long long y,long long z){
	for(int i = x;i <= min(y,cn[x] * cnt);i++){
		a[i] += z,sum[cn[x]] += z;
	}
	if(cn[x] != cn[y]){
		for(int i = (cn[y] - 1) * cnt + 1;i <= y;i++){
			a[i] += z,sum[cn[y]] += z;
		}
	}
	for(int i = cn[x] + 1;i < cn[y];i++){
		lazy[i] += z;
	}
}
long long query(long long x,long long y){
	long long ans = 0;
	for(int i = x;i <= min(y,cn[x] * cnt);i++){
		ans += a[i] + lazy[cn[x]];
	}
	if(cn[x] != cn[y]){
		for(int i = (cn[y] - 1) * cnt + 1;i <= y;i++){
			ans += a[i] + lazy[cn[y]];
		}
	}
	for(int i = cn[x] + 1;i < cn[y];i++){
		ans += sum[i] + lazy[i] * cnt;
	}
}
int main(){
	cin>>n>>m;
	cnt = sqrt(n);
	for(int i = 1;i <= n;i++){
		cn[i] = (i - 1) / cnt + 1;
	}
	for(int i = 1;i <= n;i++){
		cin >> a[i];
		sum[cn[i]] += a[i];
	}
	while(m--){
		int op,x,y;
		cin>>op>>x>>y;
		if(op == 1){
			long long z;
			cin >> z;
			update(x,y,z);
		}
		else {
			cout<<query(x,y)<<endl;
		}
	}
	
}

求调

2022/8/9 10:48
加载中...