#include <bits/stdc++.h>
#define int long long
using namespace std;
struct tree
{
int l, r, addlazy=0, ans;
} t[2000100];
int n, m, a[2000100];
void build(int l, int r, int k)
{
t[k].l = l;
t[k].r = r;
if (l == r)
{
t[k].ans = a[l];
return;
}
int mid = (l + r) >> 1;
build(l, mid, k << 1);
build(mid + 1, r, k << 1 | 1);
t[k].ans = t[k << 1].ans + t[k << 1 | 1].ans;
return;
}
void pushdown(int k)
{
int mid = (t[k].l + t[k].r) >> 1;
t[k << 1].ans += (mid - t[k].l + 1) * t[k].addlazy;
t[k << 1 | 1].ans += (t[k].r - mid) * t[k].addlazy;
t[k << 1].addlazy += t[k].addlazy;
t[k << 1 | 1].addlazy += t[k].addlazy;
t[k].addlazy = 0;
return;
}
void t_add(int l, int r, int ans, int k)
{
if (t[k].l >= l && t[k].r <= r)
{
t[k].ans += (t[k].r - t[k].l + 1) * ans;
t[k].addlazy += ans;
return;
}
if (t[k].l > r || t[k].r < l)
return;
if (t[k].addlazy)
pushdown(k);
t_add( l, r,ans,k << 1);
t_add( l, r, ans,k << 1 | 1);
t[k].ans = t[k << 1].ans+ t[k << 1 | 1].ans;
}
int query(int l,int r,int k){
if (t[k].l >= l && t[k].r <= r)
{
return t[k].ans;
}
if (t[k].l > r || t[k].r < l)
return 0;
if (t[k].addlazy)pushdown(k);
return query( l, r,k << 1) + query( l, r,k << 1 | 1);
}
signed main()
{
cin >> n >> m;
for (int i = 1; i <= n; i++)
cin >> a[i];
build(1, n, 1);
int a, b, c;
for (int i = 1; i <= m; i++)
{
cin >> a;
if (a == 1)
{
cin >> a >> b >> c;
t_add(a, b, c, 1);
}
if (a == 2)
{
cin>>a>>b;
cout<<query(a,b,1)<<endl;
}
}
return 0;
}