#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
using namespace std;
#include <vector>
#include <set>
#include <map>
#include <unordered_map>
#include <cstdio>
#include <cstring>
#include <queue>
#include <cstdlib>
#include <algorithm>
#include <list>
#include <string>
#include <cmath>
#include <bitset>
#include <stack>
#include <unordered_set>
#define ull unsigned long long
#define ll long long
#define pii pair<ll ,ll>
#define ft first
#define sd second
#define pr pair
#define cy cout<<"Yes"<<endl
#define cn cout<<"No"<<endl
#define forn(i,n) for(int (i)=0;(i)<(n);(i)++)
#define forne(i,n) for(int (i)=1;(i)<=(n);(i)++)
#define rforn(i,n) for(int (i)=(n-1);(i)>=(0);(i)--)
#define rforne(i,n) for(int (i)=(n);(i)>=(1);(i)--)
#define sorta(a) sort((a).begin(),(a).end())
#define sortcmp(a,cmp) sort((a).begin(),(a).end(),cmp)
#define vv vector
const int inf = 0x4f4f4f4f;
const int N = 2e5 + 5;
ll t;
class Tree_Array {
private:
int n, a[N];
ll sm[N];
ll c1[N];
int lowbit(int x) {
return x & (-x);
}
ll c2[N];
public:
void init(int n) {
this->n = n;
memset(a, 0, sizeof(a));
memset(c1, 0, sizeof(c1));
memset(c2, 0, sizeof(c2));
memset(sm, 0, sizeof(sm));
forne(i,n){
cin >> a[i];
}
forne(i, n) {
add(c1, i, a[i] - a[i - 1]);
add(c2, i, i * (a[i] - a[i - 1]));
}
}
void add(ll c[], int i, ll ret) {
for (; i <= n; i += lowbit(i))
c[i] += ret;
}
ll sum(ll c[], int i) {
ll s = 0;
for (; i > 0; i -= lowbit(i))
s += c[i];
return s;
}
void add_SSd( int l, int r, ll ret) {
add(c1, l, ret); add(c1, r + 1, -ret);
add(c2, l, l * ret); add(c2, r + 1, -(r+1) * ret);
}
ll sum_ssd(int l, int r) {
return sm[r]-sm[l-1]+
(r + 1) * sum(c1, r) - (l)*sum(c2, l - 1)
- (sum(c2, r) - sum(c2, l - 1));
}
};
void solve() {
int n, f; cin >> n >> f;
Tree_Array s;
s.init(n);
forn(i, f) {
int a; cin >> a;
switch (a)
{
case 1:
int l, r; cin >> l >> r;
int ret; cin >> ret;
s.add_SSd(l, r, ret);
break;
case 2:
cin >> ret;
s.add_SSd(1, 1, ret);
break;
case 3:
cin >> ret;
s.add_SSd(1, 1, -ret);
break;
case 4:
cin >> l >> r;
cout << s.sum_ssd(l, r) << endl;
break;
case 5:
cout << s.sum_ssd(1, 1) << endl;
break;
default:
break;
}
}
}
int main() {
t = 1;
while (t--)
solve();
return 0;
}