#include <bits/stdc++.h>
using namespace std;
long long n,m,p[500002],a,b,c,d;
struct tree{
long long k,lazy,l,r;
}k[500002];
void build(long long l,long long r,long long p1){
long long h=p1*2,j=h+1;
k[p1].l=l,k[p1].r=r;
if(l==r){k[p1].k=p[l];return;}
long long mid=(l+r)/2;
build(l,mid,h),build(mid+1,r,j);
k[p1].k=k[h].k+k[j].k;
}
void pushup(long long p1){
k[p1].k=k[p1*2].k+k[p1*2+1].k;
}
void lazy1(long long p1){
if(k[p1].lazy){
long long h=p1*2,j=h+1;
if(k[p1].l==k[p1].r){k[p1].lazy=0;return;}
k[h].lazy+=k[p1].lazy,k[j].lazy+=k[p1].lazy;
k[h].k+=(k[h].r-k[h].l+1)*k[p1].lazy;
k[j].k+=(k[j].r-k[j].l+1)*k[p1].lazy;
k[p1].lazy=0;
lazy1(h),lazy1(j);
}
}
void insert(long long l,long long r,long long k1,long long p1){
if(l<=k[p1].l && k[p1].r<=r){k[p1].k+=(k[p1].r-k[p1].l+1)*k1,k[p1].lazy+=k1;return;}
long long mid=(k[p1].l+k[p1].r)/2;
lazy1(p1);
if(mid>=l)insert(l,r,k1,p1*2);
if(mid<r)insert(l,r,k1,p1*2+1);
pushup(p1);
}
long long search(long long l,long long r,long long p1){
if(l<=k[p1].l && k[p1].r<=r) return k[p1].k;
long long sum=0;
long long mid=(k[p1].l+k[p1].r)/2;
lazy1(p1);
if(mid>=l) sum+=search(l,r,p1*2);
if(mid<r) sum+=search(l,r,p1*2+1);
return sum;
}
int main(){
ios::sync_with_stdio(0);
cin.tie(),cout.tie();
cin >> n >> m;
for(long long i=1;i<=n;i++) cin >> p[i];
build(1,n,1);
while(m--){
cin >> a;
if(a==1){
cin >> b >> c >> d;insert(b,c,d,1);
}else{
cin >> b >>c;
cout << search(b,c,1) << "\n";
}
}
}
https://www.luogu.com.cn/record/170064318