#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N = 100005;
int n, m, a[N], tree[N * 4], lazy[N * 4];//lazy:懒标记 
void build(int node, int l, int r)
{
	if (l == r)//叶子 
	{
		tree[node] = a[l];//只有叶子真正存值 
		return;
	}
	
	int mid = l + (r - l) / 2;//二分,不然时间复杂度会退化 
	build(node * 2, l, mid);//建左边的树
	build(node * 2 + 1, mid + 1, r); //建右边的树 
	tree[node] = tree[node * 2] + tree[node * 2 + 1];//合并
}
void push_down(int node, int l, int r)
{
	if (lazy[node] != 0)
	{
		int mid = l + (r - l) / 2;
		int lc = node * 2;
		int rc = node * 2 + 1;
		/*
		左孩子 = 2 *  根节点, 右孩子 = 2 *  根节点 + 1 
		lc = left_child 左孩子
		rc = right_child 右孩子 
		*/
		lazy[lc] += lazy[node];
		tree[lc] += lazy[node] * (mid - l + 1);
		/*
		
		*/
		lazy[rc] += lazy[node];
		tree[rc] += lazy[node] * (r - mid);
		
		lazy[node] = 0; 
	}
}
void solve1(int node, int l, int r, int ql, int qr, int k)
{
	if (ql <= l && r <= qr)
	{
		tree[node] += k * (r - l + 1);
		lazy[node] += k;
		return;
	}
	push_down(node, l, r);
	
	int mid = l + (r - l) / 2;
	if (ql <= mid) solve1(node * 2, l, mid, ql, qr, k);
	if (qr > mid) solve1(node * 2 + 1, mid + 1, r, ql ,qr, k);
	
	tree[node] = tree[node * 2] + tree[node * 2 + 1];
}
int solve2(int node, int l, int r, int ql, int qr)
{
	if (ql <= l && r <= qr)
	{
		return tree[node];
	}
	push_down(node, l, r);
	
	int mid = l + (r - l) / 2;
	int ans = 0;
	if (ql <= mid) ans += solve2(node * 2, l, mid, ql, qr);
	if (qr > mid) ans += solve2(node * 2 + 1, mid + 1, r, ql, qr);
	return ans;
}
signed main(){
	ios::sync_with_stdio(false);
	cin.tie(0);

	cin >> n >> m;
	for (int i = 1; i <= n; i++)
	{
		cin >> a[i];
	}
	build(1, 1, n);
	//cout << tree[1] << '\n';
	while(m--)
	{
		int opt;
		cin >> opt;
		if (opt == 1)
		{
			int x, y, k;
			cin >> x >> y >> k;
			solve1(1, 1, n, x, y, k);
		}
		else
		{
			int x, y;
			cin >> x >> y;
			cout << solve2(1, 1, n, x, y) << '\n';
		}
	} 
	return 0;
}