#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
using ll = long long;
#define lson (o << 1)
#define rson ((o << 1) | 1)
#define mid ((l + r) >> 1)
const int N = 1e5 + 5;
inline ll read(){
ll x = 0;
char c = getchar();
while(!isdigit(c)){
c = getchar();
}
while(isdigit(c)){
x = (x << 3) + (x << 1) + c - '0';
c = getchar();
}
return x;
}
struct segtree{
ll sum, laz;
}dat[N << 1];
ll n, q, a[N];
void update(ll o){
dat[o].sum = dat[lson].sum + dat[rson].sum;
return ;
}
void build(ll o, ll l, ll r){
if(l == r){
dat[o].sum = a[l];
return ;
}
build(lson, l, mid);
build(rson, mid + 1, r);
update(o);
return ;
}
void pushdown(ll o, ll l, ll r){
if(dat[o].laz){
dat[lson].sum += (dat[o].laz * (mid - l + 1));
dat[rson].sum += (dat[o].laz * (r - mid));
dat[lson].laz += dat[o].laz;
dat[rson].laz += dat[o].laz;
}
dat[o].laz = 0;
return ;
}
void modify(ll o, ll l, ll r, ll ql, ll qr, ll v){
if(l >= ql and r <= qr){
dat[o].sum += (v * (r - l + 1));
dat[o].laz += v;
return ;
}
pushdown(o, l, r);
if(ql <= mid) modify(lson, l, mid, ql, qr, v);
if(qr > mid) modify(rson, mid + 1, r, ql, qr, v);
update(o);
return ;
}
ll query(ll o, ll l, ll r, ll ql, ll qr){
if(l >= qr and r <= qr) return dat[o].sum;
pushdown(o, l, r);
ll res = 0;
if(ql <= mid) res += query(lson, l, mid, ql, qr);
if(qr > mid) res += query(rson, mid + 1, r, ql, qr);
return res;
}
int main(){
n = read(), q = read();
for(ll i = 1; i <= n; i++){
a[i] = read();
}
build(1, 1, n);
while(q--){
ll op = read();
if(op == 1){
ll x = read(), y = read(), z = read();
modify(1, 1, n, x, y, z);
}
else if(op == 2){
ll x = read(), y = read();
cout << query(1, 1, n, x, y) << '\n';
}
}
return 0;
}