#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1e5+5;
ll n,q,a[N],tree[N],tag[N];
ll ls(ll x){return x << 1;}
ll rs(ll x){return x << 1 | 1;}
void build(ll l,ll r,ll x)
{
if(l == r)
{
tree[x] = a[l];
return ;
}
ll mid = l + ((r - l) >> 1);
build(l,mid,ls(x));
build(mid + 1,r,rs(x));
tree[x] = tree[ls(x)] + tree[rs(x)];
}
void update(ll l,ll r,ll c,ll s,ll t,ll x)
{
if(l <= s && t <= r)
{
tree[x] += (t - s + 1) * c;
tag[x] += c;
return ;
}
ll mid = s + ((t - s) >> 1);
if(tag[x])
{
tree[ls(x)] += tag[x] * (mid - s + 1);
tree[rs(x)] += tag[x] * (t - mid);
tag[ls(x)] += tag[x];
tag[rs(x)] += tag[x];
}
tag[x] = 0;
if(l <= mid)
{
update(l,r,c,s,mid,ls(x));
}
if(r > mid)
{
update(l,r,c,mid+1,t,rs(x));
}
tree[x] = tree[ls(x)] + tree[rs(x)];
}
ll query(int l,int r,int s,int t,int x)
{
cout << l << " " << r << " " << s << " " << t << " " << x << endl;
if(l <= s && t <= r)
{
return tree[x];
}
ll mid = s + ((t - s) >> 1);
if(tag[x])
{
tree[ls(x)] += tag[x] * (mid - s + 1);
tree[rs(x)] += tag[x] * (t - mid);
tag[ls(x)] += tag[x];
tag[rs(x)] += tag[x];
}
tag[x] = 0;
ll sum = 0;
if(l <= mid) sum += query(l,r,s,mid,ls(x));
if(r > mid) sum += query(l,r,mid + 1,t,rs(x));
return sum;
}
int main()
{
cin >> n >> q;
for(int i = 1;i <= n;i++) cin >> a[i];
build(1,n,1);
for(int i = 1;i <= q;i++)
{
int opr;
cin >> opr;
if(opr == 1)
{
int x,y,z;
cin >> x >> y >> z;
update(x,y,z,1,n,1);
}
else
{
int x,y;
cin >> x >> y;
cout << query(x,y,1,n,1) << endl;
}
}
}