#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N = 1e6 + 5;
int a[N];
struct stu
{
int left , right;
int data , lazy;
}tree[N << 2];
void build(int l , int r , int i)
{
tree[i].lazy = 0;
tree[i].left = l;
tree[i].right = r;
if (l == r)
{
tree[i].data = a[i];
return ;
}
int mid = l + r >> 1;
build(l , mid , i << 1);
build(mid + 1 , r , i << 1 | 1);
tree[i].data = tree[i << 1].data + tree[i << 1 | 1].data;
}
void pushdown(int i)
{
if (tree[i].lazy != 0)
{
tree[i << 1].lazy += tree[i].lazy;
tree[i << 1 | 1].lazy += tree[i].lazy;
int mid = tree[i].left + tree[i].right >> 1;
tree[i << 1].data += tree[i].lazy * (mid - tree[i << 1].left + 1);
tree[i << 1 | 1].data += tree[i].lazy * (tree[i << 1 | 1].right - mid);
tree[i].lazy = 0;
}
}
int query(int l , int r , int i)
{
if (tree[i].left >= l && tree[i].right <= r)
{
return tree[i].data;
}
pushdown(i);
int ans = 0;
if (tree[i << i].right >= l)
{
ans += query(l , r , i << 1);
}
if (tree[i << 1 | 1].left <= r)
{
ans += query(l , r , i << 1 | 1);
}
return ans;
}
void modify(int l , int r , int k , int i)
{
if (tree[i].left >= l && tree[i].right <= r)
{
tree[i].data += k * (tree[i].right - tree[i].left + 1);
tree[i].lazy += k;
return ;
}
pushdown(i);
if (tree[i << 1].right >= l)
{
modify(l , r , k , i << 1);
}
if (tree[i << 1 | 1].left <= r)
{
modify(l , r , k , i << 1 | 1);
}
tree[i].data = tree[i << 1].data + tree[i << 1 | 1].data;
}
signed main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int n , m;
cin >> n >> m;
for (int i = 1; i <= n; i++)
{
cin >> a[i];
}
build(1 , n , 1);
while (m--)
{
int op;
cin >> op;
if (op == 1)
{
int x , y , k;
cin >> x >> y >> k;
modify(x , y , k , 1);
}
if (op == 2)
{
int x , y;
cin >> x >> y;
cout << query(x , y , 1) << endl;
}
}
return 0;
}