rt,写的是线段树
#include<bits/stdc++.h>
#define _ls p<<1
#define _rs p<<1|1
#define now sgt[p]
#define ls sgt[_ls]
#define rs sgt[_rs]
typedef long long ll;
using namespace std;
const int maxi=1e5+9;
struct node{
ll sum,laz;
int s,t,m;
}sgt[maxi<<2];
int N,M,a[maxi],L,R,D;
inline void update(int p){now.sum=ls.sum+rs.sum;}
void build(int s,int t,int p){
now.s=s,now.t=t,now.m=(s+t)>>1;
if(s==t){
now.sum=1ll*a[s];return;
}
build(s,now.m,_ls),build(now.m+1,t,_rs);
update(p);
return;
}
inline void pushdown(int p){
if(now.laz){
ls.sum+=now.laz*(ls.t-ls.s+1);
rs.sum+=now.laz*(rs.t-rs.s+1);
ls.laz+=now.laz,rs.laz+=now.laz;
now.laz=0;
}
return;
}
void wt(int p){
if(L<=now.s&&now.t<=R){
now.sum+=1ll*D*(now.t-now.s+1);
now.laz+=1ll*D;
return;
}
pushdown(p);
if(L<=now.m)wt(_ls);
if(now.m<R)wt(_rs);
update(p);
return;
}
ll rd(int p){
if(L<=now.s&&now.t<=R)return now.sum;
ll ans=0;
pushdown(p);
if(L<=now.m)ans+=rd(_ls);
if(now.m<R)ans+=rd(_rs);
update(p);
return ans;
}
int main(){
cin>>N>>M;
for(int i=1;i<=N;i++)scanf("%d",&a[i]);
build(1,N,1);
for(int i=1,op;i<=M;i++){
scanf("%d",&op);
if(op==1){
scanf("%d%d%d",&L,&R,&D);
wt(1);
}
if(op==2){
scanf("%d%d",&L,&R);
printf("%lld\n",rd(1));
}
}
return 0;
}