0pts求调
查看原帖
0pts求调
342993
wise_barbarian楼主2024/8/28 21:44
#include<bits/stdc++.h>
#define ll long long 
using namespace std;

ll a[100010];
ll lazy[400040],sum[400040];
int n,m;

void build(int p,int front,int end){
	lazy[p]=0;
	if(front==end){
		sum[p]=a[front];
		return ;
	}
	int mid=(front+end)/2;
	build(2*p,front,mid);
	build(2*p+1,mid+1,end);
	sum[p]=sum[2*p]+sum[2*p+1];
}

void lazy_down(int p,int front,int end){
	if(lazy[p]==0) return ;
	int mid=(front+end)/2;
	lazy[2*p]+=lazy[p],lazy[2*p+1]+=lazy[p],sum[2*p]+=(mid-front+1)*lazy[p],sum[2*p+1]+=(end-mid)*lazy[p],lazy[p]=0;
}

void check(int p,int front,int end,int x,int y,int v){
	if(front>y||end<x) return ;
	if(front>=x&&end<=y) {
			lazy[p]+=v,sum[p]+=v*(front-end+1);
			return ;
		}
	lazy_down(p,front,end);
	int mid=(front+end)/2;
	if(mid>=x) check(2*p,front,mid,x,y,v);
	if(mid<y) check(2*p+1,mid+1,end,x,y,v);
	sum[p]=sum[2*p]+sum[2*p+1];
}

ll find(int p,int front,int end,int x,int y){
	if(x>end||y<front) return 0;
	if(x<=front&&y>=end) return sum[p];
	lazy_down(p,front,end);
	int mid=(front+end)>>1;
	return find(2*p,front,mid,x,y)+find(2*p+1,mid+1,end,x,y);
}
 
int main(){ 
	int c,x,y,z;
	cin>>n>>m;
	for(int i=1;i<=n;i++) cin>>a[i];
	build(1,1,n);
	for(int i=1;i<=m;i++){
		cin>>c;
		if(c==1){
			cin>>x>>y>>z;
			check(1,1,n,x,y,z);
		}
		else {
			cin>>x>>y;
			cout<<find(1,1,n,x,y)<<endl;
		}
	}
	return 0;
}
2024/8/28 21:44
加载中...