#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define rep(i,s,t) for(register ll i = s;i <= t;++i)
#define per(i,t,s) for(register ll i = t;i >= s;--i)
struct segment_tree
{
ll l;
ll r;
ll sum;
ll tag;
};
ll n;
ll q;
ll a[1000005] = {};
segment_tree t[10000005];
inline ll read()
{
ll x = 0;
ll y = 1;
char c = getchar();
while(c < '0' || c > '9')
{
if(c == '-')
y = -y;
c = getchar();
}
while(c >= '0' && c <= '9')
{
x = (x << 3) + (x << 1) + (c - '0');
c = getchar();
}
return x * y;
}
inline void write(ll x)
{
if(x < 0)
{
putchar('-');
write(abs(x));
return;
}
if(x > 9)
write(x / 10);
putchar(x % 10 + '0');
}
inline ll lson(ll p)
{
return p << 1;
}
inline ll rson(ll p)
{
return p << 1 | 1;
}
inline void push_up(ll p)
{
t[p].sum = t[lson(p)].sum + t[rson(p)].sum;
}
inline void push_down(ll p)
{
t[lson(p)].tag += t[p].tag;
t[lson(p)].sum += t[p].tag * (t[lson(p)].r - t[lson(p)].l + 1);
t[rson(p)].tag += t[p].tag;
t[rson(p)].sum += t[p].tag * (t[rson(p)].r - t[rson(p)].l + 1);
t[p].tag = 0;
}
inline void build(ll p,ll l,ll r)
{
t[p].l = l;
t[p].r = r;
if(l == r)
{
t[p].sum = a[l];
return;
}
ll mid = l + r >> 1;
build(lson(p),l,mid);
build(rson(p),mid + 1,r);
push_up(p);
}
inline void update(ll p,ll l,ll r,ll k)
{
if(t[p].l >= l && t[p].r <= r)
{
t[p].sum += k * (t[p].r - t[p].l + 1);
t[p].tag += k;
return;
}
push_down(p);
ll mid = t[p].l + t[p].r >> 1;
if(l <= mid)
update(lson(p),l,mid,k);
if(r > mid)
update(rson(p),mid + 1,r,k);
push_up(p);
}
inline ll query(ll p,ll l,ll r)
{
if(t[p].l >= l && t[p].r <= r)
return t[p].sum;
push_down(p);
ll ans = 0;
ll mid = t[p].l + t[p].r >> 1;
if(l <= mid)
ans += query(lson(p),l,mid);
if(r > mid)
ans += query(rson(p),mid + 1,r);
return ans;
}
int main()
{
n = read();
q = read();
rep(i,1,n)
a[i] = read();
build(1,1,n);
rep(i,1,q)
{
ll opt = 0;
opt = read();
if(opt == 1)
{
ll l = 0;
ll r = 0;
ll k = 0;
l = read();
r = read();
k = read();
update(1,l,r,k);
}
else
{
ll l = 0;
ll r = 0;
l = read();
r = read();
write(query(1,l,r));
putchar('\n');
}
}
return 0;
}