#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
const int N = 7;
int T , n , a[N] , tr[4 * N] , add[N];
void spread(int node,int start,int end)
{
if(add[node])
{
int mid = start + end >> 1;
tr[node * 2] += add[node] * (mid - start + 1);
tr[node * 2 + 1] += add[node] * (end - mid);
add[node * 2] += add[node];
add[node * 2 + 1] += add[node];
add[node] = 0;
}
}
void modify(int node,int start,int end,int l,int r,int val)
{
if(start >= l && end <= r)
{
tr[node] += (end - start + 1) * val;
add[node] += val;
return ;
}
spread(node , start , end);
int mid = start + end >> 1;
if(l <= mid)
modify(node << 1 , start , mid , l , r , val);
if(r >= mid + 1)
modify(node << 1 + 1, mid + 1 , end , l , r , val);
tr[node] = tr[node * 2] + tr[node * 2 +];
}
int query(int node, int start, int end, int l,int r){
if (start > r || end < l){
return 0;
}
else if (l <= start && r >= end){
return tr[node];
}
else {
spread(node , start , end);
int mid = (start + end) / 2;
int left = 2 * node;
int right = 2 * node + 1;
int sum_left = 0 , sum_right = 0;
if(l <= mid)
sum_left = query(left , start, mid, l, r);
if(r >= mid + 1)
sum_right = query(right , mid+1, end, l, r);
return sum_left + sum_right;
}
}
void build(int node , int start , int end)
{
if(start == end){
tr[node] = a[start];
}
else{
int mid = (start + end) / 2;
int left = node * 2;
int right = node * 2 + 1;
build(left , start , mid);
build(right , mid + 1 , end);
tr[node] = tr[left] + tr[right];
}
}
void solve(int c , int x)
{
for(int i = 1 ; i <= c ; ++i) scanf("%d" , &a[i]);
build(1 , 1 , c);
while(x--)
{
int opr;
cin>>opr;
if(opr==1)
{
int r , w , q;
cin >> r >> w >> q;
modify(1 , 1 , c , r , w , q);
}
else
{
int r , w;
cin >> r >> w;
cout << query(1 , 1 , c , r , w) << endl;
}
}
}
int main()
{
int c , t;
while(cin >> c >> t)
{
solve(c , t);
}
return 0;
}