import java.util.Scanner;
public class Main{
long[] t,lz,sz,v;
int n;
public void Build(int x,int l,int r){
if(l==r) {sz[x]=1;t[x]=v[l];return;}
int mid=(l+r)>>1;
Build(x<<1,l,mid);
Build(x<<1|1,mid+1,r);
sz[x]=sz[x<<1]+sz[x<<1|1];
t[x]=t[x<<1]+t[x<<1|1];
}
public Main(int tmp){
n=tmp;
v=new long[n+1];
t=new long[n*4+10];
lz=new long[n*4+10];
sz=new long[n*4+10];
Scanner In=new Scanner(System.in);
for(int i=1;i<=n;i++)
v[i]=In.nextInt();
Build(1,1,n);
}
public static void main(String argc[]){
Scanner In=new Scanner(System.in);
int tmp=In.nextInt();
int k=In.nextInt();
Main xzy=new Main(tmp);
for(;k>0;k--)
{
int tp=In.nextInt(),x=In.nextInt();
int y=In.nextInt(),tt;
if(tp==2)
System.out.println(xzy.Query(1,x,y,1,tmp));
else
{
tt=In.nextInt();
xzy.Modify(1,x,y,1,tmp,tt);
}
}
}
public void add(int x,long k){
t[x]+=k*sz[x];lz[x]+=k;
}
public void putlz(int x){
if(lz[x]!=0)
{
add(x<<1,lz[x]);
add(x<<1|1,lz[x]);
lz[x]=0;
}
}
public long Query(int x,int ql,int qr,int l,int r){
if(l>=ql&&r<=qr)
{
return t[x];
}
putlz(x);
int mid=(l+r)>>1;
long ans=0;
if(ql<=mid) ans+=Query(x<<1,ql,qr,l,mid);
if(qr>mid) ans+=Query(x<<1|1,ql,qr,mid+1,r);
return ans;
}
public void Modify(int x,int ql,int qr,int l,int r,int key){
if(l>=ql&&r<=qr) {add(x,key);return;}
putlz(x);
int mid=(l+r)>>1;
if(ql<=mid) Modify(x<<1,ql,qr,l,mid,key);
if(qr>mid) Modify(x<<1|1,ql,qr,mid+1,r,key);
t[x]=t[x<<1]+t[x<<1|1];
}
}