#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N = 100005;
int n, m, a[N], tree[N * 4], lazy[N * 4];//lazy:懒标记
void build(int node, int l, int r)
{
if (l == r)//叶子
{
tree[node] = a[l];//只有叶子真正存值
return;
}
int mid = l + (r - l) / 2;//二分,不然时间复杂度会退化
build(node * 2, l, mid);//建左边的树
build(node * 2 + 1, mid + 1, r); //建右边的树
tree[node] = tree[node * 2] + tree[node * 2 + 1];//合并
}
void push_down(int node, int l, int r)
{
if (lazy[node] != 0)
{
int mid = l + (r - l) / 2;
int lc = node * 2;
int rc = node * 2 + 1;
/*
左孩子 = 2 * 根节点, 右孩子 = 2 * 根节点 + 1
lc = left_child 左孩子
rc = right_child 右孩子
*/
lazy[lc] += lazy[node];
tree[lc] += lazy[node] * (mid - l + 1);
/*
*/
lazy[rc] += lazy[node];
tree[rc] += lazy[node] * (r - mid);
lazy[node] = 0;
}
}
void solve1(int node, int l, int r, int ql, int qr, int k)
{
if (ql <= l && r <= qr)
{
tree[node] += k * (r - l + 1);
lazy[node] += k;
return;
}
push_down(node, l, r);
int mid = l + (r - l) / 2;
if (ql <= mid) solve1(node * 2, l, mid, ql, qr, k);
if (qr > mid) solve1(node * 2 + 1, mid + 1, r, ql ,qr, k);
tree[node] = tree[node * 2] + tree[node * 2 + 1];
}
int solve2(int node, int l, int r, int ql, int qr)
{
if (ql <= l && r <= qr)
{
return tree[node];
}
push_down(node, l, r);
int mid = l + (r - l) / 2;
int ans = 0;
if (ql <= mid) ans += solve2(node * 2, l, mid, ql, qr);
if (qr > mid) ans += solve2(node * 2 + 1, mid + 1, r, ql, qr);
return ans;
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(0);
cin >> n >> m;
for (int i = 1; i <= n; i++)
{
cin >> a[i];
}
build(1, 1, n);
//cout << tree[1] << '\n';
while(m--)
{
int opt;
cin >> opt;
if (opt == 1)
{
int x, y, k;
cin >> x >> y >> k;
solve1(1, 1, n, x, y, k);
}
else
{
int x, y;
cin >> x >> y;
cout << solve2(1, 1, n, x, y) << '\n';
}
}
return 0;
}