#include<bits/stdc++.h>
#define int unsigned long long
using namespace std;
int n,m;
int a[100005],ans[200005],tag[200005];
void push_up(int node)
{
ans[node]=ans[node<<1]+ans[node<<1|1];
}
void push_down(int node,int l,int r)
{
int mid=(l+r)>>1;
tag[node<<1]+=tag[node];
tag[node<<1|1]+=tag[node];
ans[node<<1]+=tag[node]*(mid-l+1);
ans[node<<1|1]+=tag[node]*(r-mid);
tag[node]=0;
}
void build(int node,int l,int r)
{
if(l==r)
{
ans[node]=a[l];
return;
}
int mid=(l+r)>>1;
build(node<<1,l,mid);
build(node<<1|1,mid+1,r);
push_up(node);
}
void update(int l,int r,int nodel,int noder,int node,int x)
{
if(l<=nodel&&noder<=r)
{
ans[node]+=x*(noder-nodel+1);
tag[node]+=x;
return;
}
push_down(node,nodel,noder);
int mid=(l+r)>>1;
if(l<=mid)update(l,r,nodel,mid,node<<1,x);
if(r>mid)update(l,r,mid+1,noder,node<<1|1,x);
push_up(node);
}
int query(int l,int r,int nodel,int noder,int node)
{
if(l<=nodel&&noder<=r)return ans[node];
int ret=0,mid=(l+r)>>1;
push_down(node,nodel,noder);
if(l<=mid)ret+=query(l,r,nodel,mid,node<<1);
if(r>mid)ret+=query(l,r,mid+1,noder,node<<1|1);
return ret;
}
main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)
scanf("%lld",&a[i]);
build(1,1,n);
for(int i=1,x,y,k;i<=m;i++)
{
scanf("%lld",&x);
if(x==1)
{
scanf("%lld%lld%lld",&x,&y,&k);
update(x,y,1,n,1,k);
}
else
{
scanf("%lld%lld",&x,&y);
printf("%lld\n",query(x,y,1,n,1));
}
}
return 0;
}