lishunji @ 2023-09-27 13:42:17
#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;
}
by y_kx_b @ 2023-09-27 13:51:06
@lishunji 用 %lld 输入输出()
by lishunji @ 2023-09-27 13:57:16
@y_kx_b 草,忘了()这下A了