#include<iostream>
#include<algorithm>
using namespace std;
#define lson o << 1, l, M
#define rson o << 1 | 1, M+1, r
#define lo o << 1
#define ro o << 1 | 1
const int N = 2e5 + 10;
long long v[N << 2], lazy[N << 2];
inline void pushup(int o) {
v[o] = v[o << 1] + v[o << 1 | 1];
}
inline long long cal(long long a0, long long n) {
return a0 * n + (n - 1) * n / 2;
}
inline void pushdown(int o, int ln, int rn) {
if(lazy[o]) {
lazy[lo] = lazy[o];
lazy[ro] = lazy[o] + ln;
v[lo] = cal(lazy[o], ln);
v[ro] = cal(lazy[ro], rn);
lazy[o] = 0;
}
}
void Build(int o, int l, int r) {
if(l == r) {
scanf("%lld", &v[o]);
return ;
}
int M = (l + r) / 2;
Build(lson);
Build(rson);
pushup(o);
}
void update(int L, int R, long long k, int o, int l, int r) {
if(L <= l) {
if(R >= r) {
long long C = k + (l - L);
v[o] = cal(C, r - l + 1);
lazy[o] = C;
return ;
}
}
int M = (l + r) / 2;
pushdown(o, M - l + 1, r - M);
if(L <= M)
update(L, R, k, lson);
if(R > M)
update(L, R, k, rson);
pushup(o);
}
long long query(int L, int R, int o, int l, int r) {
if(L <= l) {
if(R >= r)
return v[o];
}
int M = (l + r) / 2;
pushdown(o, M - l + 1, r - M);
long long Sum = 0;
if(L <= M)
Sum += query(L, R, lson);
if(R > M)
Sum += query(L, R, rson);
return Sum;
}
int main() {
int n, m;
scanf("%d%d", &n, &m);
Build(1, 1, n);
int op, l, r;
long long k;
while(m--) {
scanf("%d%d%d", &op, &l, &r);
if(op == 1) {
scanf("%lld", &k);
update(l, r, k, 1, 1, n);
} else
printf("%lld\n", query(l, r, 1, 1, n));
}
return 0;
}