#1AC其他WA
//P3372
#include <cstdio>
const long long maxn=100005;
struct node{long long l,r,value,lazy;}t[maxn<<2];
long long a[maxn];
void pushup(long long node){
t[node].value=t[node<<1].value+t[node<<1|1].value;
return;
}
void pushdown(long long node){
if(t[node].lazy){
// if(t[node].l!=t[node].r){
t[node<<1].lazy=t[node].lazy;
t[node<<1|1].lazy=t[node].lazy;
t[node<<1].value+=t[node<<1].lazy*(t[node<<1].r-t[node<<1].l+1);
t[node<<1|1].value+=t[node<<1|1].lazy*(t[node<<1|1].r-t[node<<1|1].l+1);
// }
t[node].lazy=0;
}
return;
}
void buildtree(long long l,long long r,long long node){
t[node].l=l;
t[node].r=r;
if(l==r){
t[node].value=a[l];
return;
}
long long m=l+((r-l)>>1);
buildtree(l,m,node<<1);
buildtree(m+1,r,node<<1|1);
pushup(node);
return;
}
void add(long long l1,long long r1,long long v,long long l,long long r,long long node){
if(l1<=l && r<=r1){
t[node].lazy+=v;
t[node].value+=t[node].lazy*(t[node].r-t[node].l+1);
return;
}
pushdown(node);
long long m=l+((r-l)>>1);
if(l1<=m) add(l1,r1,v,l,m,node<<1);
if(m<r1) add(l1,r1,v,m+1,r,node<<1|1);
pushup(node);
return;
}
long long query(long long l1,long long r1,long long l,long long r,long long node){
int ret=0;
if(l1<=l && r<=r1){
return t[node].value;
}
pushdown(node);
long long m=l+((r-l)>>1);
if(l1<=m) ret+=query(l1,r1,l,m,node<<1);
if(m<r1) ret+=query(l1,r1,m+1,r,node<<1|1);
return ret;
}
int main(){
long long n,m,opt,x,y,k;
scanf("%lld %lld",&n,&m);
for(long long i=1; i<=n; ++i)
scanf("%lld",&a[i]);
buildtree(1,n,1);
for(long long i=0; i<m; ++i){
scanf("%lld %lld %lld",&opt,&x,&y);
switch(opt){
case 1:
scanf("%lld",&k);
add(x,y,k,1,n,1);
break;
case 2:
printf("%lld\n",query(x,y,1,n,1));
break;
}
}
return 0;
}