#include<iostream>
using namespace std;

#define int long long 
#define lc u << 1
#define rc u << 1 | 1 
const int N = 5 * 1e5 + 5;

struct node{
	int l, r;
	int x, ad;
}t[N << 2];
int a[N];

void pushup(int u){
	t[u].x = t[lc].x + t[rc].x;
}

void pushdown(int u){
	if(t[u].ad){
		t[lc].x += (t[lc].r - t[lc].l + 1) * t[u].ad;
		t[lc].ad += t[u].ad;
		t[rc].x += (t[rc].r - t[rc].l + 1) * t[u].ad;
		t[rc].ad += t[u].ad;
		t[u].ad = 0;
	}
}

void build(int u, int l, int r){
	t[u] = {l, r, 0, 0};
	if(l == r){
		t[u].x = a[l];
		return;
	}
	int mid = (l + r) >> 1;
	build(lc, l, mid);
	build(rc, mid + 1, r);
	pushup(u);
}

void add(int u, int l, int r, int k){
	if(l <= t[u].l && t[u].r <= r){
		t[u].x += (t[u].r - t[u].l + 1) * k;
		t[u].ad += k;
		return;
	}
	pushdown(u);
	int mid = (t[u].l + t[u].r) >> 1;
	if(l <= mid) add(lc, l, r, k);
	if(r > mid) add(rc, l, r, k);
	pushup(u);
}

int ask(int u, int l, int r){
	if(l <= t[u].l && t[u].r <= r){
		return t[u].x;
	}
	int mid = (t[u].l + t[u].r) >> 1;
	pushdown(u);
	int ans = 0;
	if(l <= mid) ans += ask(lc, l, r);
	if(r > mid) ans += ask(rc, l, r);
	return ans;
}

int n, m;

signed main(){
	
	cin >> n >> m;
	
	for(int i = 1;i <= n;i ++){
		cin >> a[i];
	}
	
	build(1, 1, n);
	
	for(int i = 1;i <= m;i ++){
		int op;
		cin >> op;
		if(op == 1){
			int x, y, k;
			cin >> x >> y >> k;
			add(1, x, y, k);
		}
		else{
			int x, y; cin >> x >> y;
			cout << ask(1, x, y) << '\n';
		}
	}
	return 0;
}
