#include<bits/stdc++.h>
#define lid (id<<1)
#define rid (id<<1|1)
using namespace std;
int n, m, a[500005], b, x, y, z;
struct seg_tree{
int l, r;
int sum, lazy;
}tr[2000005];
void build(int id, int l, int r) //建树
{
tr[id].l=l;
tr[id].r=r;
if(l==r)
{
tr[id].sum=a[l];
return ;
}
int mid=(l+r)>>1;
build(lid, l, mid);
build(rid, mid+1, r);
tr[id].sum=tr[lid].sum+tr[rid].sum;
}
void pushdown(int id) //下放lazy
{
if(tr[id].lazy&&tr[id].l!=tr[id].r)
{
tr[lid].lazy+=tr[id].lazy;
tr[rid].lazy+=tr[id].lazy;
tr[lid].sum+=tr[id].lazy*(tr[lid].r-tr[lid].l+1);
tr[rid].sum+=tr[id].lazy*(tr[rid].r-tr[rid].l+1);
tr[id].lazy=0;
}
}
void modify(int id, int l, int r, int val)//区间修改
{
pushdown(id);
if(tr[id].l==l&&tr[id].r==r)
{
tr[id].lazy+=val;
tr[id].sum+=val*(tr[id].r-tr[id].l+1);
return ;
}
int mid=(tr[id].l+tr[id].r)>>1;
if(r<=mid)
{
modify(lid, l, r, val);
}
else if(l>mid)
{
modify(rid, l, r, val);
}
else
{
modify(lid, l, mid, val);
modify(rid, mid+1, r, val);
}
tr[id].sum=tr[lid].sum+tr[rid].sum;
}
int query(int id,int l, int r) //区间查询
{
pushdown(id);
if(tr[id].l==l&&tr[id].r==r)
{
return tr[id].sum;
}
int mid=(tr[id].l+tr[id].r)>>1;
if(r<=mid)
{
return query(lid, l, r);
}
if(l>mid)
{
return query(rid, l, r);
}
return query(lid,l,mid)+query(rid,mid+1,r);
}
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)
{
cin>>a[i];
}
build(1,1,n);
for(int i=1;i<=m;i++)
{
cin>>b;
if(b==1)
{
cin>>x>>y>>z;
modify(1, x, y, z);
}
else
{
cin>>x>>y;
cout<<query(1,x,y)<<endl;
}
}
return 0;
}