/*
ID: allen.c1
PROG: HORRIBLE
LANG: C++
*/
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<vector>
#include<set>
#include<utility>
#include<cstring>
#include<stack>
#include<queue>
#include<map>
#include<deque>
#include<cmath>
#include<map>
using namespace std;
#define rep(i, n) for(__typeof(n) i = 0; i < (n); i++)
#define pi 3.1415926535897
typedef long long LL;
typedef pair<int, int> pii;
typedef pair<pii, int> edge;
const int maxn = 1 << 18;
LL seg[2 * maxn];
LL lazy[2 * maxn];
LL mat[maxn];
int qa, qb;
LL qv;
int t, n, m;
void down(int rt, int a, int b) {
if (lazy[rt]) {
if (a < b) {
lazy[rt * 2] += lazy[rt];
lazy[rt * 2 + 1] += lazy[rt];
int mid = (a + b) / 2;
seg[rt * 2] += lazy[rt] * LL(mid - a + 1);
seg[rt * 2 + 1] += lazy[rt] * LL(b - mid);
}
lazy[rt] = 0;
}
}
void update(int rt, int a, int b) {
if (a > qb || b < qa) return;
if (qa <= a && b <= qb) {
seg[rt] += qv * LL(b - a + 1);
lazy[rt] += qv;
return;
}
down(rt, a, b);
int mid = (a + b) / 2;
update(rt * 2, a, mid);
update(rt * 2 + 1, mid + 1, b);
seg[rt] = seg[rt * 2] + seg[rt * 2 + 1];
}
LL query(int rt, int a, int b) {
if (a > qb || b < qa) return 0;
if (qa <= a && b <= qb) return seg[rt];
down(rt, a, b);
int mid = (a + b) / 2;
return query(rt * 2, a, mid) + query(rt * 2 + 1, mid + 1, b);
}
int main() {
scanf("%d", &t);
for (int tests = 0; tests < t; tests++) {
memset(seg, 0, sizeof(seg));
memset(lazy, 0, sizeof(lazy));
scanf("%d%d", &n, &m);
for (int i = 0; i < m; i++) {
int q;
scanf("%d", &q);
if (q == 0) {
scanf("%d%d%I64d", &qa, &qb, &qv);
update(1, 1, n);
}
else if (q == 1) {
scanf("%d%d", &qa, &qb);
cout << query(1, 1, n) << endl;
}
}
cout << endl;
}
}
LyoKSUQ6IGFsbGVuLmMxClBST0c6IEhPUlJJQkxFCkxBTkc6IEMrKwogKi8KI2luY2x1ZGU8aW9zdHJlYW0+CiNpbmNsdWRlPGNzdGRpbz4KI2luY2x1ZGU8YWxnb3JpdGhtPgojaW5jbHVkZTx2ZWN0b3I+CiNpbmNsdWRlPHNldD4KI2luY2x1ZGU8dXRpbGl0eT4KI2luY2x1ZGU8Y3N0cmluZz4KI2luY2x1ZGU8c3RhY2s+CiNpbmNsdWRlPHF1ZXVlPgojaW5jbHVkZTxtYXA+CiNpbmNsdWRlPGRlcXVlPgojaW5jbHVkZTxjbWF0aD4KI2luY2x1ZGU8bWFwPgoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCiNkZWZpbmUgcmVwKGksIG4pIGZvcihfX3R5cGVvZihuKSBpID0gMDsgaSA8IChuKTsgaSsrKQojZGVmaW5lIHBpIDMuMTQxNTkyNjUzNTg5NwoKdHlwZWRlZiBsb25nIGxvbmcgTEw7CnR5cGVkZWYgcGFpcjxpbnQsIGludD4gcGlpOwp0eXBlZGVmIHBhaXI8cGlpLCBpbnQ+IGVkZ2U7Cgpjb25zdCBpbnQgbWF4biA9IDEgPDwgMTg7CkxMIHNlZ1syICogbWF4bl07CkxMIGxhenlbMiAqIG1heG5dOwpMTCBtYXRbbWF4bl07CmludCBxYSwgcWI7CkxMIHF2OwppbnQgdCwgbiwgbTsKCnZvaWQgZG93bihpbnQgcnQsIGludCBhLCBpbnQgYikgewoJaWYgKGxhenlbcnRdKSB7CgkJaWYgKGEgPCBiKSB7CgkJCWxhenlbcnQgKiAyXSArPSBsYXp5W3J0XTsKCQkJbGF6eVtydCAqIDIgKyAxXSArPSBsYXp5W3J0XTsKCgkJCWludCBtaWQgPSAoYSArIGIpIC8gMjsKCQkJc2VnW3J0ICogMl0gKz0gbGF6eVtydF0gKiBMTChtaWQgLSBhICsgMSk7CgkJCXNlZ1tydCAqIDIgKyAxXSArPSBsYXp5W3J0XSAqIExMKGIgLSBtaWQpOwoJCX0KCQlsYXp5W3J0XSA9IDA7Cgl9Cgp9Cgp2b2lkIHVwZGF0ZShpbnQgcnQsIGludCBhLCBpbnQgYikgewoJaWYgKGEgPiBxYiB8fCBiIDwgcWEpIHJldHVybjsKCWlmIChxYSA8PSBhICYmIGIgPD0gcWIpIHsKCQlzZWdbcnRdICs9IHF2ICogTEwoYiAtIGEgKyAxKTsKCQlsYXp5W3J0XSArPSBxdjsKCQlyZXR1cm47Cgl9Cglkb3duKHJ0LCBhLCBiKTsKCglpbnQgbWlkID0gKGEgKyBiKSAvIDI7Cgl1cGRhdGUocnQgKiAyLCBhLCBtaWQpOwoJdXBkYXRlKHJ0ICogMiArIDEsIG1pZCArIDEsIGIpOwoJc2VnW3J0XSA9IHNlZ1tydCAqIDJdICsgc2VnW3J0ICogMiArIDFdOwp9CgpMTCBxdWVyeShpbnQgcnQsIGludCBhLCBpbnQgYikgewoJaWYgKGEgPiBxYiB8fCBiIDwgcWEpIHJldHVybiAwOwoJaWYgKHFhIDw9IGEgJiYgYiA8PSBxYikgcmV0dXJuIHNlZ1tydF07Cglkb3duKHJ0LCBhLCBiKTsKCglpbnQgbWlkID0gKGEgKyBiKSAvIDI7CglyZXR1cm4gcXVlcnkocnQgKiAyLCBhLCBtaWQpICsgcXVlcnkocnQgKiAyICsgMSwgbWlkICsgMSwgYik7Cn0KCmludCBtYWluKCkgewoJCXNjYW5mKCIlZCIsICZ0KTsKCQlmb3IgKGludCB0ZXN0cyA9IDA7IHRlc3RzIDwgdDsgdGVzdHMrKykgewoJCQltZW1zZXQoc2VnLCAwLCBzaXplb2Yoc2VnKSk7CgkJCW1lbXNldChsYXp5LCAwLCBzaXplb2YobGF6eSkpOwoJCQlzY2FuZigiJWQlZCIsICZuLCAmbSk7CgkJCWZvciAoaW50IGkgPSAwOyBpIDwgbTsgaSsrKSB7CgkJCQlpbnQgcTsKCQkJCXNjYW5mKCIlZCIsICZxKTsKCQkJCWlmIChxID09IDApIHsKCQkJCQlzY2FuZigiJWQlZCVJNjRkIiwgJnFhLCAmcWIsICZxdik7CgkJCQkJdXBkYXRlKDEsIDEsIG4pOwoJCQkJfQoJCQkJZWxzZSBpZiAocSA9PSAxKSB7CgkJCQkJc2NhbmYoIiVkJWQiLCAmcWEsICZxYik7CgkJCQkJY291dCA8PCBxdWVyeSgxLCAxLCBuKSA8PCBlbmRsOwoJCQkJfQoJCQl9CgkJCWNvdXQgPDwgZW5kbDsKCQl9Cgp9Cg==