#include<bits/stdc++.h>
using namespace std;
#define ls(x) (x<<1)
#define rs(x) (x<<1|1)
#define int long long
int n,m,a[100005],x,y,k,b;
int t[400005],lazy_tag[400005];
void push_back(int f){
t[f]=t[ls(f)]+t[rs(f)];
}
void push_down(int f,int x,int y){
int mid=(x+y)>>1;
lazy_tag[ls(f)]=lazy_tag[ls(f)]+lazy_tag[f];
lazy_tag[rs(f)]=lazy_tag[rs(f)]+lazy_tag[f];
t[ls(f)]+=lazy_tag[ls(f)]*(mid-x+1);
t[rs(f)]+=lazy_tag[rs(f)]*(y-mid);
lazy_tag[f]=0;
}
void build(int f,int l,int r){
lazy_tag[f]=0;
if(l==r){t[f]=a[l];return ;}
int mid=(l+r)>>1;
build(ls(f),l,mid);
build(rs(f),mid+1,r);
push_back(f);
}
void pus(int f,int l,int r,int x,int y,int k){
if(x<=l&&y>=r){lazy_tag[f]+=k;t[f]+=(r-l+1)*k;return ;}
push_down(f,l,r);
int mid=(l+r)>>1;
if(x<=mid) pus(ls(f),l,mid,x,y,k);
if(y>mid) pus(rs(f),mid+1,r,x,y,k);
push_back(f);
}
int query(int f,int l,int r,int x,int y){
if(x<=l&&y>=r){return t[f];}
int mid=(l+r)>>1;int ans=0;
push_down(f,l,r);
if(x<=mid) ans+=query(ls(f),l,mid,x,y);
if(y>mid) ans+=query(rs(f),mid+1,r,x,y);
return ans;
}
signed main(){
cin >> n >> m;
for(int i=1;i<=n;i++){
cin >> a[i];
}
build(1,1,n);
while(m--){
cin >> b;
if(b==1){
cin >> x >> y >> k;
pus(1,1,n,x,y,k);
}
else if(b==2){
cin >> x >> y;
int ans=query(1,1,n,x,y);
cout << ans << endl;
}
}
return 0;
}
对照题解检查不出问题,求助巨佬们qaq