70分求调
查看原帖
70分求调
574644
lishunji楼主2023/9/27 13:42
#include<bits/stdc++.h>
using namespace std;
struct node{long long O;}o;
long long n,m,ans,a[1000010],add[4000010],sum[4000010];
void maketree(long long k,long long l,long long r){
	if(l==r){
		sum[k]=a[l];
		return;
	}
	long long mid=(l+r)>>1;
	maketree(k*2,l,mid);
	maketree(k*2+1,mid+1,r);
	sum[k]=sum[k*2]+sum[k*2+1];
}
void Add(long long k,long long l,long long r,long long v){
	add[k]+=v;
	sum[k]+=(r-l+1)*v;
	return ;
}
void pushdown(long long k,long long l,long long r,long long mid){
	if(add[k]==0) return ;
	Add(k*2,l,mid,add[k]);
	Add(k*2+1,mid+1,r,add[k]);
	add[k]=0;
}
void updata(long long k,long long l,long long r,long long x,long long y,long long v){
	if(x<=l&&r<=y){
		Add(k,l,r,v);
		return ;
	}
	if(l==r) return ;
	long long mid=(l+r)>>1;
	pushdown(k,l,r,mid);
	if(l<=mid) updata(k*2,l,mid,x,y,v);
	if(r>mid) updata(k*2+1,mid+1,r,x,y,v);
	sum[k]=sum[k*2]+sum[k*2+1];
}
long long que(long long k,long long l,long long r,long long x,long long y){
	if(r<x||y<l) return 0;
	if(x<=l&&r<=y) return sum[k];
	long long mid=(l+r)>>1;
	pushdown(k,l,r,mid);
	return (que(k*2,l,mid,x,y)+que(k*2+1,mid+1,r,x,y));
}
int main(){
	scanf("%d%d",&n,&m);
	for(long long i=1;i<=n;i++) scanf("%d",&a[i]);
	maketree(1,1,n);
	for(long long i=1;i<=m;i++){
		long long x,y,k;
		scanf("%d",&o.O);
		if(o.O==1){
			scanf("%d%d%d",&x,&y,&k);
			updata(1,1,n,x,y,k);
		}
		else{
			scanf("%d%d",&x,&y);
			printf("%d\n",que(1,1,n,x,y));
		}
	}
	return 0;
}
2023/9/27 13:42
加载中...