#include <bits/stdc++.h>
#define freopen(x) freopen(#x".in","r",stdin);freopen(#x".out","w",stdout);
#define foru(i,j,k) for(register int i=j;i<=k;i++)
#define ford(i,j,k) for(register int i=j;i>=k;i--)
#define ps(x) puts(#x)
#define ll long long
#define int long long
#define N 1000005
inline ll read(){register char ch=getchar();register ll s=0;while(!isdigit(ch))ch=getchar();while(isdigit(ch)){s=(s<<3)+(s<<1)+(ch^48);ch=getchar();}return s;}
inline void print(ll x){if(x<0)putchar('-');if(x>9)print(x/10);putchar(x%10+48);}
using namespace std;
int n,cz,opt,x,y,k;
int a[N],t[4*N],tag[4*N];
inline int ls(int p){return p<<1;}
inline int rs(int p){return p<<1|1;}
inline void push_up(int p){t[p]=t[ls(p)]+t[rs(p)];}
void build(int l,int r,int p)
{
if(l==r)t[p]=a[l];
int m=(l+r)>>1;
build(l,m,ls(p));
build(m+1,r,rs(p));
push_up(p);
}
inline void f(int p,int l,int r,int k)
{
tag[p]+=k;
t[p]+=k*(r-l+1);
}
inline void push_down(int p,int l,int r)
{
int m=(l+r)>>1;
f(ls(p),l,m,tag[p]);
f(rs(p),m+1,r,tag[p]);
tag[p]=0;
}
void add(int qx,int qy,int l,int r,int p,int k)
{
if(qx<=l&&r<=qy)
{
tag[p]+=k;
t[p]+=k*(r-l+1);
return;
}
push_down(p,l,r);
int m=(l+r)>>1;
if(qx<=m)add(qx,qy,l,m,ls(p),k);
if(qy>m)add(qx,qy,m+1,r,rs(p),k);
push_up(p);
}
ll query(int qx,int qy,int l,int r,int p)
{
ll res=0;
if(qx<=l&&r<=qy)return t[p];
int mid=(l+r)>>1;
push_down(p,l,r);
if(qx<=mid)res+=query(qx,qy,l,mid,ls(p));
if(qy>mid) res+=query(qx,qy,mid+1,r,rs(p));
return res;
}
signed main()
{
n=read(),cz=read();
foru(i,1,n)a[i]=read();
build(1,n,1);
while(cz--)
{
opt=read(),x=read(),y=read();
if(opt==1)k=read(),add(x,y,1,n,1,k);
else print(query(x,y,1,n,1)),ps();
}
return 0;
}