#include <bits/stdc++.h>
#define ls o<<1
#define rs o<<1|1
using namespace std;
int a[100005] , f[100005] , v[100005];
inline void push_up (int o)
{
f[o] = f[ls] + f[rs];
}
void build_tree (int o , int l , int r)
{
if (l == r)
{
f[o] = a[l];
return ;
}
int mid = (l + r) >> 1;
build_tree (ls , l , mid);
build_tree (rs , mid + 1 , r);
push_up (o);
}
void push_down (int o , int l , int r)
{
if (v[o])
{
int mid = (l + r) >> 1;
f[ls] += (mid - l + 1) * v[o];
f[rs] += (r - mid) * v[o];
v[ls] += v[o];
v[rs] += v[o];
v[o] = 0;
}
}
void add (int o , int l , int r , int s , int t , int p)
{
if (l >= s && r <= t)
{
f[o] += (t - s + 1) * p;
v[o] += p;
return;
}
push_down (o , l , r);
int mid = (l + r) >> 1;
if (t <= mid)
add (ls , l , mid , s , t , p);
else if (s > mid)
add (rs , mid + 1 , r , s , t , p);
else
add (ls , l , mid , s , mid , p) , add (rs , mid + 1 , r , mid + 1 , t , p);
}
int calc (int o , int l , int r , int s , int t)
{
if (l == s && r == t)
{
return f[o];
}
push_down (o , l , r);
int mid = (l + r) >> 1;
if (t <= mid)
return calc (ls , l , mid , s , t);
else if (s > mid)
return calc (rs , mid + 1 , r , s , t);
else
return calc (ls , l , mid , s , mid) + calc (rs , mid + 1 , r , mid + 1 , t);
}
signed main ()
{
ios::sync_with_stdio (false);
int n , m;
cin >> n >> m;
for (int i = 1; i <= n; i++)
{
cin >> a[i];
}
build_tree (1 , 1 , n);
for (int i = 1; i <= m; i++)
{
int op , x , y;
cin >> op >> x >> y;
if (op == 1)
{
int k;
cin >> k;
add (1 , 1 , n , x , y , k);
}
else if (op == 2)
{
cout << calc (1 , 1 , n , x , y) << endl;
}
}
return 0;
}