#include<iostream>
using namespace std;
int num[100000000];
struct node
{
node* child_l = NULL;
node* child_r = NULL;
int l = 0, r = 0;
long long lzy = 0;
long long val = 0;
};
void push_down(node* root)
{
if (root->child_l == root->child_r || root->lzy == 0) return;
root->child_l->val = root->child_l->val + root->lzy * (root->child_l->r - root->child_l->l + 1);
root->child_r->val = root->child_r->val + root->lzy * (root->child_r->r - root->child_r->l + 1);
root->child_l->lzy = root->child_l->lzy + root->lzy;
root->child_r->lzy = root->child_r->lzy + root->lzy;
root->lzy = 0;
}
long long build(node* root, int num[])
{
if (root->l == root->r)
{
root->val = num[root->l];
return root->val;
}
int ln = root->l;
int rn = root->r;
int mid = (ln + rn) / 2;
root->child_l = new node; root->child_l->l = ln , root->child_l->r = mid, root->child_l->val = build(root->child_l, num);
root->child_r = new node; root->child_r->l = mid + 1, root->child_r->r = rn, root->child_r->val = build(root->child_r, num);
root->val = root->child_l->val + root->child_r->val;
return root->val;
}
void add(node* root, int l, int r, int val)
{
if (root->l >= l && root->r <= r)
{
root->val = root->val + val * (root->r - root->l + 1);
root->lzy = root->lzy + val;
return;
}
push_down(root);
int mid = (root->r + root->l) / 2;
if (l <= mid) add(root->child_l, l, r, val);
if (r >= mid + 1) add(root->child_r, l, r, val);
root->val = root->child_l->val + root->child_r->val;
}
long long find(node* root, int l, int r)
{
if (root->l >= l && root->r <= r) return root->val;
push_down(root); long long re = 0;
int mid = (root->r + root->l) / 2;
if (l <= mid) re += find(root->child_l, l, r);
if (r >= mid + 1) re += find(root->child_r, l, r);
return re;
}
int main()
{
int n, q; cin >> n >> q;
node* G = new node;
G->l = 1, G->r = n;
for (int i = 1; i <= n; i++)
cin >> num[i];
build(G, num);
for (int i = 1; i <= q; i++)
{
int x, y, v, b; cin >> x;
if (x == 1) cin >> y >> v >> b, add(G, y, v, b);
else cin >> y >> v, cout << find(G, y, v) << endl;
}
}