#include<bits/stdc++.h>
using namespace std;
int n,m,x,y,val,com,s[];
struct st{
int l,r,val,add;
}tr[];
void build(int l,int r,int k)
{
tr[k].l=l;
tr[k].r=r;
if(l==r)
{
tr[k].val=s[l];
return;
}
int mid=(l+r)>>;
build(l,mid,k<<);
build(mid+,r,k<<|);
tr[k].val = tr[k<<].val + tr[k<<|].val;
}
void pus(int k)
{
int l=tr[k].l;
int r=tr[k].r;
tr[k].add+=tr[k>>].add;
tr[k].val+=(r-l+)*tr[k>>].add;
}
void update(int x,int y,int k,int val)
{
if(tr[k].add)
{
pus(k<<);
pus(k<<|);
tr[k].add=;
}
int l=tr[k].l;
int r=tr[k].r;
int mid=(l+r)>>;
if(y<l || x>r)
return;
if(x<=l && r<=y)
{
tr[k].val += (l-r+)*val;
tr[k].add += val;
return;
}
else
{
if(x<=mid)
update(x,y,k<<,val);
if(y>mid)
update(x,y,k<<|,val);
tr[k].val = tr[k<<].val + tr[k<<|].val;
}
}
int sum(int x,int y,int k)
{
if(tr[k].add)
{
pus(k<<);
pus(k<<|);
tr[k].add=;
}
int l=tr[k].l;
int r=tr[k].r;
int mid=(l+r)>>;
if(y<l || x>r)
return ;
if(x<=l && r<=y)
return tr[k].val;
else
{
int ans=;
if(x<=mid)
ans+=sum(x,y,k<<);
if(y>mid)
ans+=sum(x,y,k<<|);
return ans;
}
}
main(){
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++)
scanf("%d",&s[i]);
build(,n,);
while(m--)
{
scanf("%d",&com);
if(com==)
{
scanf("%d%d%d",&x,&y,&val);
update(x,y,,val);
}
else
{
scanf("%d%d",&x,&y);
printf("%d\n",sum(x,y,));
}
}
}