#include<bits/stdc++.h>
#define MAXN 100010
using namespace std;
struct tree
{
int l,r;
long long tag,val;
int lch,rch;
}rt[MAXN*4];
int cnt;
long long a[MAXN];
long long sum(int x)
{
return rt[x].val+rt[x].tag*(rt[x].r-rt[x].l+1);
}
int build(int l,int r)
{
cnt++;
int x=cnt;
rt[x].l=l;
rt[x].r=r;
if(l==r)
{
rt[x].val=a[l];
return x;
}
int mid=(l+r)/2;
rt[x].lch=build(l,mid);
rt[x].rch=build(mid+1,r);
rt[x].val=rt[rt[x].lch].val+rt[rt[x].rch].val;
return x;
}
void spread(int x)
{
if(rt[x].tag)
{
// rt[x].val+=rt[x].tag*(rt[x].r-rt[x].l+1);
rt[rt[x].lch].tag+=rt[x].tag;
rt[rt[x].rch].tag+=rt[x].tag;
rt[x].tag=0;
}
}
void change(int x,int l,int r,int v)
{
if(l<=rt[x].l&&r>=rt[x].r)
{
// rt[x].val+=v*(rt[x].r-rt[x].l+1);
rt[x].tag+=v;
return ;
}
spread(x);
int mid=(rt[x].l+rt[x].r)/2;
if(l<=mid) change(rt[x].lch,l,r,v);
if(r>mid) change(rt[x].rch,l,r,v);
rt[x].val=sum(rt[x].lch)+sum(rt[x].rch);
//rt[rt[x].lch].val+rt[rt[x].rch].val;
}
long long ask(int x,int l,int r)
{
if(l<=rt[x].l&&r>=rt[x].r) return sum(x);
spread(x);
int mid=(rt[x].l+rt[x].r)/2;
long long tmp=0;
if(l<=mid) tmp+=ask(rt[x].lch,l,r);
if(r>mid) tmp+=ask(rt[x].rch,l,r);
return tmp;
}
int n,m;
int main()
{
// freopen("P3372_1.in","r",stdin);
cin>>n>>m;
for(int i=1;i<=n;i++) cin>>a[i];
build(1,n);
for(int i=1;i<=m;i++)
{
int opt,x,y,k;
cin>>opt;
if(opt==1)
{
cin>>x>>y>>k;
change(1,x,y,k);
}
if(opt==2)
{
cin>>x>>y;
cout<<ask(1,x,y)<<endl;
}
}
return 0;
}