#include <bits/stdc++.h>
#define ll long long
using namespace std;
ll n , m , in[2000001] , tree[2000001] , marks[2000001] , a , x , y , k;
inline ll ls (ll x)
{
return x<<1;
}
inline ll rs (ll x)
{
return (x<<1)+1;
}
inline void push_up (ll root)
{
tree[root] += tree[ls(root)] + tree[rs(root)];
return;
}
void build (ll root , ll l , ll r)
{
if (l == r)
{
tree[root] = in[l];
return;
}
ll mid = (l+r)>>1;
build (ls(root) , l , mid);
build (rs(root) , mid+1 , r);
push_up(root);
return;
}
inline void mark (ll root , ll l , ll r , ll data)
{
marks[root] += data;
tree[root] += tree[root]+data*(r-l+1);
return;
}
inline void push_down (ll root , ll l , ll r)
{
ll mid = (l+r)>>1;
mark (ls(root) , l , mid , marks[root]);
mark (rs(root) , mid+1 , r , marks[root]);
marks[root] = 0;
return;
}
inline void update (ll ans_l , ll ans_r , ll l , ll r , ll root , ll data)
{
if (ans_l <= l && ans_r >= r)
{
tree[root] += data*(r-l+1);
marks[root] += data;
return;
}
push_down(root , l , r);
ll mid = (l+r)>>1;
if (ans_l <= mid) update(ans_l , ans_r , l , mid , ls(root) , data);
if (ans_r > mid) update(ans_l , ans_r , mid+1 , r , rs(root) , data);
push_up(root);
return;
}
ll ans (ll ans_l , ll ans_r , ll l , ll r , ll root)
{
ll ans_ = 0;
if (ans_l <= l && ans_r >= r) return tree[root];
ll mid = (l+r)>>1;
push_down (root , l , r);
if (ans_l <= mid) ans_ += ans(ans_l , ans_r , l , mid , ls(root));
if (ans_r > mid) ans_ += ans(ans_l , ans_r , mid+1, r , rs(root));
return ans_;
}
int main()
{
scanf("%lld%lld" , &n , &m);
for (ll i = 1 ; i <= n ; i++) scanf("%lld" , &in[i]);
build (1 , 1 , n);
for (ll i = 1 ; i <= m ; i++)
{
scanf("%lld" , &a);
if (a == 1)
{
scanf("%lld%lld%lld" , &x , &y , &k);
update (x , y , 1 , n , 1 , k);
}
else
{
scanf("%lld%lld" , &x , &y);
printf("%lld\n" , ans(x , y , 1 , n , 1));
}
}
return 0;
}