#include<bits/stdc++.h>
#define LL long long
using namespace std;
template<class T>inline void read(T &n){
n=0;LL k=1;char c=getchar();
while(!isdigit(c)){if(c=='-')k=-k;c=getchar();}
while(isdigit(c))n=n*10+c-'0',c=getchar();
n*=k;
}
template<class T>inline void write(T n){
if(n<0)putchar('-'),n=-n;
if(n>9)write(n/10);
putchar(n%10+'0');
}
const LL MaxN=1e5+5;
LL n,m,a[MaxN];
LL opt,x,y,k;
struct node{
LL l,r;
LL sum,add;
};node t[MaxN<<2+2];
inline void build(LL p,LL l,LL r){
t[p].l=l,t[p].r=r;
if(l==r){
t[p].sum=a[l];
return ;
}
LL mid=(l+r)>>1;
build(p<<1,l,mid);
build(p<<1|1,mid+1,r);
t[p].sum=t[p<<1].sum+t[p<<1|1].sum;
}
inline void spread(LL p){
if(t[p].add){
t[p<<1].sum+=t[p].add*(t[p<<1].r-t[p<<1].l+1);
t[p<<1|1].sum+=t[p].add*(t[p<<1|1].r-t[p<<1|1].l+1);
t[p<<1].add+=t[p].add;
t[p<<1|1].add+=t[p].add;
t[p].add=0;
}
}
inline void change(LL p,LL l,LL r,LL k){
if(l<=t[p].l&&r>=t[p].r){
t[p].sum+=k*(t[p].r-t[p].l+1);
t[p].add+=k;
return ;
}
spread(p);
LL mid=(l+r)>>1;
if(l<=mid)change(p<<1,l,r,k);
if(r>mid)change(p<<1|1,l,r,k);
t[p].sum=t[p<<1].sum+t[p<<1|1].sum;
}
inline LL ask(LL p,LL l,LL r){
if(l<=t[p].l&&r>=t[p].r)return t[p].sum;
spread(p);
LL mid=(t[p].l+t[p].r)>>1;
LL ans=0;
if(l<=mid)ans+=ask(p<<1,l,r);
if(r>mid)ans+=ask(p<<1|1,l,r);
return ans;
}
int main(){
read(n),read(m);
for(LL i=1;i<=n;i++){
read(a[i]);
}
build(1,1,n);
for(LL i=1;i<=m;i++){
read(opt),read(x),read(y);
if(opt==1){
read(k);
change(1,x,y,k);
}else{
write(ask(1,x,y));
putchar('\n');
}
}
return 0;
}