#include<bits/stdc++.h>
#define M 1000001
using namespace std;
int n , q;
int tree[M * 4] , a[M];
int lazy[M * 4];
int k;
void maketree(int node , int l , int r){
if(l == r){
tree[node] = a[l];
}
else{
int mid = l + (r - l) / 2;
maketree(node * 2 , l , mid);
maketree(node * 2 + 1 , mid + 1 , r);
tree[node] = tree[node * 2] + tree[node * 2 + 1];
}
}
void pushdown(int node , int l , int r){
int mid = l + (r - l) / 2;
tree[node * 2] += lazy[node] * (mid - l + 1);
lazy[node * 2] += lazy[node];
tree[node * 2 + 1] += lazy[node] * (r - mid);
lazy[node * 2 + 1] += lazy[node];
lazy[node] = 0;
}
void add(int node , int l , int r , int ll , int rr){
if(ll == l && rr == r){
lazy[node] += k;
tree[node] += k * (r - l + 1);
return ;
}
int mid = l + (r - l) / 2;
if(lazy[node]){
pushdown(node , l , r);
}
if(rr <= mid){
add(node * 2 , l , mid , ll , rr);
}
else if(ll > mid){
add(node * 2 + 1 , mid + 1 , r , ll , rr);
}
else{
add(node * 2 , l , mid , ll , mid);
add(node * 2 + 1 , mid + 1 , r , mid + 1 , rr);
}
tree[node] = tree[node * 2 ] + tree[node * 2 + 1];
}
int check(int node , int l , int r , int ll , int rr){
if(ll == l && rr == r) return tree[node];
if(lazy[node] != 0){
pushdown(node , l , r);
}
int mid = l + (r - l) / 2;
if(rr <= mid){
return check(node * 2 , l , mid , ll , rr);
}
if(ll > mid){
return check(node * 2 + 1 , mid + 1 , r , ll , rr);
}
else{
return check(node * 2 , l , mid , ll , mid) + check(node * 2 + 1 , mid + 1 , r , mid + 1 , rr);
}
}
int main(){
scanf("%d%d" , &n , &q);
for(int i = 1 ; i <= n ; i++){
scanf("%d" , &a[i]);
}
maketree(1 , 1 , n);
while(q--){
int type , x , y ;
scanf("%d" , &type);
if(type == 1){
scanf("%d%d%d" , &x , &y , &k);
add(1 , 1 , n , x , y);
}
if(type == 2){
scanf("%d%d" , &x, &y);
printf("%d\n" , check(1 , 1, n , x , y) );
}
}
return 0;
}