#include<iostream>
#include<algorithm>
#include<vector>
#include<stack>
#include<queue>
#include<list>
#include<string>
#include<cstring>
#include<cstdlib>
#include<cstdio>
#include<cmath>
#include<ctime>
using namespace std;

typedef long long ll;

const int NIL = -1;
const int MAX = 2147483647;
const int N = 100001;
clock_t START, END;
bool debug = false;

ll sumv[500000], addv[500000];
ll ql, qr, p, v;
ll _sum;

/*void pushdown(int o)
{
	int lc = o * 2, rc = o * 2 + 1;
	if (addv[o] > 0) {
		addv[lc] = addv[rc] = addv[o];
		addv[o] = 0;
	}
}*/

void maintain(ll o, ll L, ll R)
{
	ll lc = o * 2, rc = 2 * o + 1;
	sumv[o] = 0;
	if (R > L) {
		sumv[o] = sumv[lc] + sumv[rc];
	}
	sumv[o] += addv[o] * (R - L + 1);
}

void query(ll o, ll L, ll R, ll add)
{
	ll M = L + (R - L) / 2;
	if (ql <= L && qr >= R) {
		_sum += sumv[o] + add * (R - L + 1);
	}
	else {
		if (ql <= M)
			query(o * 2, L, M, add + addv[o]);
		if (qr > M)
			query(o * 2 + 1, M + 1, R, add + addv[o]);
	}
}

void update(ll o, ll L, ll R)
{
	ll M = L + (R - L) / 2;
	ll lc = o * 2, rc = o * 2 + 1;
	if (ql <= L && qr >= R) {
		addv[o] += v;
	}
	else {
		if (ql <= M)
			update(lc, L, M);
		if (qr > M)
			update(rc, M + 1, R);
	}
	maintain(o, L, R);
}


int main(void)
{
	if (debug) {
		START = clock();
		freopen("in12.txt", "r", stdin);
		freopen("out.txt", "w", stdout);
	}
	int n, q, com;
	scanf("%d%d", &n, &q);
	for (int i = 0; i < q; i++) {
		scanf("%d", &com);
		if (com) {
			scanf("%lld%lld", &ql, &qr);
			//ql++;
			//qr++;
			_sum = 0;
			query(1, 1, n, 0);
			printf("%lld\n", _sum);
		}
		else {
			scanf("%lld%lld%lld", &ql, &qr, &v);
			//ql++;
			//qr++;
			update(1, 1, n);
		}
	}
	if (debug) {
		END = clock();
		double endtime = (double)(END - START) / 1000;
		printf("total time = %lf s", endtime);
	}
	return 0;
}
