rt
//loj132
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N=2e6+10;
struct BIT{
int bit[2][N], a[N], sum[N], n;
#define lowbit(x) ((x)&(-(x)))
inline void build(){
for(int i = 1; i <= n; ++ i){
sum[i] = sum[i-1] + a[i];
//这里没有初始化,现在的 bit 数组都是 0
}
}
inline void add(int k, int node, int v){
while(node <= n) bit[k][node] += v, node += lowbit(node);
}
inline int prefix(int k, int r){
int ans = 0;
while(r) ans += bit[k][r], r -= lowbit(r);
return ans;
}
inline void Add(int l, int r, int x){
add(0, l, x), add(0, r + 1, -x);
add(1, l, l * x), add(1, r + 1, - (r + 1) * x);
}
inline int Query(int l, int r){
int rr = sum[r] + (r + 1) * prefix(0, r) - prefix(1, r);
int ll = sum[l-1] + l * prefix(0, l - 1) - prefix(1, l - 1);
return rr - ll;
}
} k;
signed main(){
int m;
scanf("%lld%lld", &k.n, &m);
for(int i = 1; i <= k.n; ++ i){
scanf("%lld", &k.a[i]);
}
k.build();
while(m--){
char op[2]; int l, r, x;
scanf("%s%lld%lld", op, &l, &r);
if(op[0] == '1'){
scanf("%lld", &x);
k.Add(l, r, x);
} else {
printf("%lld\n", k.Query(l, r));
}
}
return 0;
}