Problem:
RSQ and RAQ

Write a program which manipulates a sequence A = {a1, a2, . . . , an} with the following operations:

add(s, t, x): add x to as, as+1, ..., at.

getSum(s, t): report the sum of as, as+1, ..., at.

Note that the initial values of ai (i = 1, 2, . . . , n) are 0.

Input

n q
query1
query2
:
queryq

In the first line, n (the number of elements in A) and q (the number of queries) are given. Then, ith query queryi is given in the following format:

0 s t x

or

1 s t

The first digit represents the type of the query. '0' denotes add(s, t, x) and '1' denotes getSum(s, t).

Output

For each getSum operation, print the sum;

Constraints

1 ≤ n ≤ 100000

1 ≤ q ≤ 100000

1 ≤ s ≤ t ≤ n

0 ≤ x < 1000

Sample Input 1

3 5
0 1 2 1
0 2 3 2
0 3 3 3
1 1 2
1 2 3

Sample Output 1

4
8

Sample Input 2

4 3
1 1 4
0 1 4 1
1 1 4

Sample Output 2

0
4

Solution in C++11 (judge verdict: Time Limit Exceeded)

//============================================================================
// Author      : JCH
// Copyright   :
// Description : Contest ACM Div1
//============================================================================

#include <bits/stdc++.h>
#define endl '\n'
using namespace std;

#define top (int)(1e5)

int elems[top ], st[4 * top ], lazy[4 * top ], n, q, op, x, y;

void push(int pos) {

	if (lazy[pos] != 0) {

		st[pos << 1] *= lazy[pos << 1];
		st[pos << 1 | 1] *= lazy[pos << 1 | 1];
		lazy[pos << 1] += lazy[pos << 1];
		lazy[pos << 1 | 1] += lazy[pos << 1 | 1];

		lazy[pos] = 0;	
	}
}

int build(int start, int end, int pos) {

	if (start == end)
		return st[pos] = elems[start];

	int md = (start + end) >> 1;

	return st[pos] = build(start, md, pos << 1)
			+ build(md + 1, end, pos << 1 | 1);

}

int query(int a, int b, int start, int end, int pos) {

	if (a > end || b < start)
		return 0;

	if (start >= a && end <= b)
		return st[pos];

	int md = (start + end) >> 1;

	push(pos);

	return query(a, b, start, md, pos << 1)
			+ query(a, b, md + 1, end, pos << 1 | 1);

}

void updt(int a, int b, int start, int end, int pos, int val) {

	if (a > end || b < start)
		return;

	if (start >= a && end <= b) {
		st[pos] += val;
		lazy[pos] += val;
		return;
	}

	int md = (start + end) >> 1;

	push(pos);

	updt(a, b, start, md, pos << 1, val);
	updt(a, b, md + 1, end, pos << 1 | 1, val);

	st[pos] = st[pos << 1] + st[pos << 1 | 1];
}

int query(int a, int b) {

	if (a > b)
		swap(a, b);

	return query(a, b, 1, n, 1);
}

int main() {

	cin.tie(0), cout.tie(0), ios_base::sync_with_stdio(0);

	cin >> n >> q;

	while (q--) {

		cin >> op;

		if (!op) {

			cin >> x >> y >> op;

			for (int i = x; i <= y; ++i)
				updt(i, i, 1, n, 1, op);

		} else {

			cin >> x >> y;

			cout << query(x, y) << endl;
		}
	}
	return 0;
}