#include<bits/stdc++.h>
#define lid id<<1
#define rid id<<1|1
#define int long long
using namespace std;
const int N=8e5+5,M=1e5+5;
int n,m,a[N];
int op,x,y,k;
struct qweqweqwe{
// int l,r;
int sum;
int lazy;
}t[N];
void mt(int l,int r,int id){ //建树,确定没问题
if(l==r){
t[id].sum=a[l];
return;
}
int mid=(l+r)>>1;
mt(l,mid,lid);
mt(mid+1,r,rid);
t[id].sum=t[lid].sum+t[rid].sum;
}
long long ask(int l,int r,int id){ //查询
if(t[id].lazy){ //每次查询前更新当前节点
t[id].sum+=(r-l+1)*t[id].lazy;
t[lid].lazy+=t[id].lazy;
t[rid].lazy+=t[id].lazy;
t[id].lazy=0;
}
if(x<=l&&r<=y)return t[id].sum; //全包含,直接返回
// if(l==r)return t[id].sum;
int mid=(l+r)>>1;
long long res=0;
if(x<=mid)res+=ask(l,mid,lid);
if(y>mid)res+=ask(mid+1,r,rid);
return res;
}
void change(int l,int r,int id){ //区间修改
if(t[id].lazy){ //每次查询前更新当前节点
t[id].sum+=1ll*(r-l+1)*t[id].lazy;
t[lid].lazy+=t[id].lazy;
t[rid].lazy+=t[id].lazy;
t[id].lazy=0;
}
if(x<=l&&r<=y){ //全包含
t[id].sum+=1ll*(r-l+1)*k;
t[lid].lazy+=k;
t[rid].lazy+=k;
return;
}
// if(l==r)return;
int mid=(l+r)/2;
if(x<=mid)change(l,mid,lid);
if(y>mid)change(mid+1,r,rid);
t[id].sum=t[lid].sum+t[rid].sum;
}
signed main(){ //主函数,确定没错
cin>>n>>m;
for(int i=1;i<=n;i++)cin>>a[i];
mt(1,n,1);
while(m--){
cin>>op;
if(op==1){
cin>>x>>y>>k;
change(1,n,1);
}
else{
cin>>x>>y;
cout<<ask(1,n,1)<<endl;
}
}
return 0;
}
已经用了各种手段了,真的调不出来了。