#include<bits/stdc++.h>
using namespace std;
#define lid (id<<1)
#define rid (id<<1|1)
#define ll long long
ll n,m,k,x,y,l,a[1000005];
struct tree{
ll r,l,lazy;
ll sum;
}t[4000005];
void build(ll id,ll l,ll r)
{
t[id].l=l;
t[id].r=r;
if(l==r)
{
t[id].sum=a[l];
return;
}
ll mid=(l+r)>>1;
build(lid,l,mid);
build(rid,mid+1,r);
t[id].sum=t[lid].sum+t[rid].sum;
}
void pushdown(ll id)
{
if(t[id].lazy&&t[id].l!=t[id].r){
t[lid].lazy+=t[id].lazy;
t[rid].lazy+=t[id].lazy;
t[lid].sum+=t[id].lazy*(t[lid].r-t[lid].l+1);
t[rid].sum+=t[id].lazy*(t[rid].r-t[rid].l+1);
t[id].lazy=0;
}
return ;
}
void change(ll id,ll val,ll l,ll r){
pushdown(id);
if(t[id].r==r&&t[id].l==l)
{
t[id].lazy+=val;
t[id].sum+=val*(t[id].r-t[id].l+1);
return ;
}
ll mid=(r+l)>>1;
if(r<=mid)
change(lid,val,l,r);
else if(l>mid)
change(rid,val,l,r);
else {
change(lid,val,l,mid);
change(rid,val,mid+1,r);
}
t[id].sum=t[lid].sum+t[rid].sum;
}
ll query(ll id,ll l,ll r)
{
pushdown(id);
if(t[id].l==l&&t[id].r==r)
{
return t[id].sum;
}
ll mid=(t[id].r+t[id].l)>>1;
if(r<=mid)
return query(lid,l,r);
else if(l>mid)
return query(rid,l,r);
else {
return query(lid,l,mid)+query(rid,mid+1,r);
}
}
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++)
{
scanf("%lld ",&a[i]);
}
build(1,1,n);
for(int i=1;i<=m;i++)
{
cin>>l;
if(l==1)
{
scanf("%lld %lld %lld",&x,&y,&k);
change(1,k,x,y);
}
else
{
scanf("%lld %lld",&x,&y);
cout<<query(1,x,y)<<endl;
}
}
return 0;
}
```