#include<bits/stdc++.h>
using namespace std;
struct tree{
int l,r;
long long pre,add;
}a[10000001];
int c[100001];
void maketree(int p,int l,int r)
{
a[p].l=l,a[p].r=r;
if(l==r)
{
a[p].pre=c[l];
return;
}
int mid=l+r>>1;
maketree(p<<1,l,mid);
maketree(p<<1|1,mid+1,r);
a[p].pre=a[p<<1].pre+a[p<<1|1].pre;
a[p].add=0;
}
void pushdown(int p)
{
a[p].pre+=a[p].add*(a[p].r-a[p].l+1);
a[p<<1].add+=a[p].add;
a[p<<1|1].add+=a[p].add;
a[p].add=0;
}
long long change(int p,int l,int r)
{
if(a[p].l>=l&&a[p].r<=r)
{
pushdown(p);
return a[p].pre;
}
if(a[p].r<l||a[p].l>r)return 0;
int mid=a[p].l+a[p].r>>1;
pushdown(p);
int s=change(p<<1,l,mid)+change(p<<1|1,mid+1,r);
a[p].pre=(a[p<<1].pre+a[p<<1].add*(a[p<<1].r-a[p<<1].l+1))+(a[p<<1|1].pre+a[p<<1|1].add*(a[p<<1|1].r-a[p<<1|1].l+1));
return s;
}
void treeplus(int p,int l,int r,int k)
{
if(a[p].l==l&&a[p].r==r)
{
a[p].add+=k;
return;
}
if(a[p].r<l||a[p].l>r)return;
int mid=a[p].l+a[p].r>>1;
pushdown(p);
if(mid>=l)
treeplus(p<<1,l,min(mid,r),k);
if(mid<r)
treeplus(p<<1|1,max(l,mid+1),r,k);
a[p].pre=(a[p<<1].pre+a[p<<1].add*(a[p<<1].r-a[p<<1].l+1))+(a[p<<1|1].pre+a[p<<1|1].add*(a[p<<1|1].r-a[p<<1|1].l+1));
}
int t;
long long x;
char ch;
long long read()
{
t=1;
x=0;
ch=getchar();
while(ch<'0'||ch>'9')
{
if(ch=='-')t=-t;
ch=getchar();
}
while(ch>='0'&&ch<='9')
{
x=(x<<1)+(x<<3)+ch-'0';
ch=getchar();
}
return t*x;
}
int main()
{
int n,m,x,y,z,k;
n=read();
m=read();
for(int i=1;i<=n;++i)
{
c[i]=read();
}
maketree(1,1,n);
for(int i=1;i<=m;++i)
{
k=read();
if(k==1)
{
x=read();
y=read();
z=read();
treeplus(1,x,y,z);
}
else
{
x=read();
y=read();
printf("%lld\n",change(1,x,y));
}
}
return 0;
}