#include "bits/stdc++.h"
#define okbut puts((ok) ? "YES" : "NO")
#define vi vector<int>
#define pii pair<int, int>
#define endl '\n'
#define inf 0x3f3f3f3f
#define orz 0
using namespace std;
using ll = long long;
inline ll ri()
{
ll x = 0 , f = 1; char ch = getchar();
while (ch < '0'|| ch > '9'){if (ch == '-') f = -1; ch = getchar();}
while (ch >= '0' && ch <= '9'){x = x * 10 + ch - 48; ch = getchar();}
return x * f;
}
const int N = 1e6 + 10;
int a[N];
namespace segtree
{
struct vex
{
int val, la; vex *ls, *rs; int l, r;
vex(): val(0), ls(NULL), rs(NULL) {}
};
inline void pushup(vex* rt) {rt -> val = (rt -> ls -> val + rt -> rs -> val);}
inline void fix(vex* rt, int k)
{
(rt -> val) += k * ((rt -> r) - (rt -> l) + 1);
(rt -> la) += k;
}
inline void pushdown(vex* rt)
{
if(rt -> la != 0)
{
fix(rt -> ls, rt -> la);
fix(rt -> rs, rt -> la);
rt -> la = 0;
}
}
inline void build(vex* rt, int l, int r)
{
rt -> l = l; rt -> r = r;
if(l == r) {rt -> val = a[l]; return;} int mid = (l + r) >> 1;
if(rt -> ls == NULL) rt -> ls = new vex(); build(rt -> ls, l, mid);
if(rt -> rs == NULL) rt -> rs = new vex(); build(rt -> rs, mid + 1, r);
pushup(rt);
}
inline int query(vex* rt, int nl, int nr)
{
if(rt == NULL) return 0;
int l = (rt -> l), r = (rt -> r); if(l == r) return rt -> val;
int res = 0; int mid = (l + r) >> 1; pushdown(rt);
if(nl <= mid) res += query(rt -> ls, nl, nr);
if(nr > mid) res += query(rt -> rs, nl, nr);
return res;
}
inline void update(vex* rt, int nl, int nr, int k)
{
if(rt == NULL) return;
int l = (rt -> l), r = (rt -> r); if(l == r) {fix(rt, k); return;}
int mid = (l + r) >> 1; pushdown(rt);
if(nl <= mid) update(rt -> ls, nl, nr, k);
if(nr > mid) update(rt -> rs, nl, nr, k);
pushup(rt);
}
}
using namespace segtree;
void solve()
{
int n = ri(), q = ri(); for(int i = 1; i <= n; i++) cin >> a[i];
vex* root = new vex(); build(root, 1, n);
while(q--)
{
int op = ri(), l = ri(), r = ri();
if(op == 1) update(root, l, r, ri());
else cout << query(root, l, r) << endl;
}
}
signed main()
{
solve(); return orz;
}