#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N = 1e5+5;
int a[N],tree[N<<2],lazy[N<<2],n,m,op,l,r,k;
void build(int i,int l,int r){
if(l==r){
tree[i]=a[l];
return;
}
int mid=l+r>>1;
build(i<<1,l,mid);
build(i<<1|1,mid+1,r);
tree[i]=tree[i<<1]+tree[i<<1|1];
}
void spread(int i,int x,int y){
int mid=l+r>>1;
lazy[i<<1]+=lazy[i];
tree[i<<1]+=lazy[i]*(mid-l+1);
lazy[i<<1|1]+=lazy[i];
tree[i<<1|1]+=lazy[i]*(r-mid);
lazy[i]=0;
}
void tag(int i,int l,int r,int x,int y,int v){
if(x<=l&&r<=y){
lazy[i]+=v;
tree[i]+=v*(r-l+1);
return;
}
spread(i,l,r);
int mid=l+r>>1;
if(x<=mid)tag(i<<1,l,mid,x,y,v);
if(y>mid)tag(i<<1|1,mid+1,r,x,y,v);
tree[i]=tree[i<<1]+tree[i<<1|1];
}
int ask(int i,int l,int r,int x,int y){
if(x<=l&&r<=y)return tree[i];
int mid=l+r>>1,ans=0;
spread(i,l,r);
if(x<=mid)ans+=ask(i<<1,l,mid,x,y);
if(y>mid)ans+=ask(i<<1|1,mid+1,r,x,y);
return ans;
}
signed main(){
cin>>n>>m;
for(int i=1;i<=n;i++)
scanf("%lld",&a[i]);
build(1,1,n);
while(m--){
scanf("%lld",&op);
if(op==1){
scanf("%lld %lld %lld",&l,&r,&k);
tag(1,1,n,l,r,k);
}
else{
scanf("%lld %lld",&l,&r);
cout<<ask(1,1,n,l,r)<<'\n';
}
}
return 0;
}
顺便提供我下载的测试数据1
in:
8 10
640 591 141 307 942 58 775 133
2 1 5
2 3 8
2 3 6
2 5 8
2 4 8
1 4 8 60
2 1 6
2 5 8
1 3 7 15
1 2 6 86
out:
2621
2356
1448
1908
2215
2859
2148