#include<bits/stdc++.h>
using namespace std;
int a[100005],n,m,k;long long ans;
struct tree
{
int l,r,data,add;
}t[400010];
void build(int l,int r,int p)
{
t[p].l=l;t[p].r=r;
if(l==r){t[p].data=a[l];return;}
int mid=(l+r)/2;
build(l,mid,p*2);
build(mid+1,r,p*2+1);
t[p].data=t[p*2].data+t[p*2+1].data;
return;
}
void sp(int p)
{
if(t[p].add)
{
t[p*2].data+=t[p].add*(t[p*2].r-t[p*2].l+1);
t[p*2+1].data+=t[p].add*(t[p*2+1].r-t[p*2+1].l+1);
t[p*2].add+=t[p].add;t[p*2+1].add+=t[p].add;
t[p].add=0;
}
}
void add(int l,int r,int p)
{
if(l<=t[p].l&&r>=t[p].r){
t[p].data+=k*(t[p].r-t[p].l+1);
t[p].add+=k;
return;
}
int mid=(t[p].l+t[p].r)/2;
sp(p);
if(mid>=l)add(l,r,p*2);
if(r>mid)add(l,r,p*2+1);
t[p].data=t[p*2].data+t[p*2+1].data;
}
void ask(int l,int r,int p)
{
if(l<=t[p].l&&r>=t[p].r){
ans+=t[p].data;return;
}
sp(p);
int mid=(t[p].l+t[p].r)/2;
if(mid>=l)ask(l,r,p*2);
if(r>mid)ask(l,r,p*2+1);
t[p].data=t[p*2].data+t[p*2+1].data;
return;
}
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)cin>>a[i];
build(1,n,1);
int li,x,y;
while(m--)
{
li=x=y=k=0;
cin>>li;
if(li==1)
{
cin>>x>>y>>k;
add(x,y,1);
}else
{
cin>>x>>y;
ans=0;
ask(x,y,1);
cout<<ans<<endl;
}
}
return 0;
}