#include <iostream>
using namespace std;
#define ll long long
struct node{
ll sum,upsum;
int lft,ryt;
bool isup;
void init(int l,int r){
lft = l;
ryt = r;
isup = false;
upsum = 0;
}
void merge(ll a,ll b){
sum = a+b;
}
}segtree[4*100005];
int n,arr[100005];
void split(int t,int l,int r){
if(l!=r){
segtree[2*t].upsum += segtree[t].upsum;
segtree[2*t].isup = true;
segtree[2*t+1].upsum += segtree[t].upsum;
segtree[2*t+1].isup = true;
}
segtree[t].sum += (r-l+1)*segtree[t].upsum;
segtree[t].upsum = 0;
segtree[t].isup = false;
}
ll build(int t,int i,int j){
if(i==j){
segtree[t].init(i,j);
segtree[t].sum = 0;
return segtree[t].sum;
}
int l=2*t,mid=(i+j)/2;
ll a,b;
a = build(l,i,mid);
b = build(l+1,mid+1,j);
segtree[t].init(i,j);
segtree[t].merge(a,b);
return segtree[t].sum;
}
ll query(int t,int i,int j,int ri,int rj){
if(segtree[t].isup)
split(t,segtree[t].lft,segtree[t].ryt);
if(ri <=i && rj>=j){
return segtree[t].sum;
}
int l=2*t,mid=(i+j)/2;
if(rj<=mid)
return query(l,i,mid,ri,rj);
if(ri>mid)
return query(l+1,mid+1,j,ri,rj);
ll a,b;
a = query(l,i,mid,ri,mid);
b = query(l+1,mid+1,j,mid+1,rj);
return a+b;
}
ll update(int t,int i,int j,int ri,int rj,int v){
if(segtree[t].isup)
split(t,segtree[t].lft,segtree[t].ryt);
if(ri <=i && rj>=j){
segtree[t].upsum +=v;
segtree[t].isup = true;
split(t,segtree[t].lft,segtree[t].ryt);
return segtree[t].sum;
}
int l=2*t,mid=(i+j)/2;
if(j<ri || i>rj)
return 0;
ll a,b;
a = update(l,i,mid,ri,rj,v);
b = update(l+1,mid+1,j,mid+1,rj,v);
segtree[t].merge(a,b);
return segtree[t].sum;
}
int main(){
int t,q,p,r,c,v;
cin>>t;
while(t--){
cin>>n>>q;
build(1,1,n);
while(q--){
cin>>c>>p>>r;
if(c==0){
cin>>v;
update(1,1,n,p,r,v);
}
else{
cout<<query(1,1,n,p,r)<<'\n';
}
}
}
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKI2RlZmluZSBsbCBsb25nIGxvbmcKCnN0cnVjdCBub2RlewoJbGwgc3VtLHVwc3VtOwoJaW50IGxmdCxyeXQ7Cglib29sIGlzdXA7Cgl2b2lkIGluaXQoaW50IGwsaW50IHIpewoJCWxmdCA9IGw7CgkJcnl0ID0gcjsKCQlpc3VwID0gZmFsc2U7CgkJdXBzdW0gPSAwOwoJfQoJdm9pZCBtZXJnZShsbCBhLGxsIGIpewoJCXN1bSA9IGErYjsKCX0KCQp9c2VndHJlZVs0KjEwMDAwNV07CgppbnQgbixhcnJbMTAwMDA1XTsKCnZvaWQgc3BsaXQoaW50IHQsaW50IGwsaW50IHIpewoJaWYobCE9cil7CgkJc2VndHJlZVsyKnRdLnVwc3VtICs9IHNlZ3RyZWVbdF0udXBzdW07CgkJc2VndHJlZVsyKnRdLmlzdXAgPSB0cnVlOwoJCXNlZ3RyZWVbMip0KzFdLnVwc3VtICs9IHNlZ3RyZWVbdF0udXBzdW07CgkJc2VndHJlZVsyKnQrMV0uaXN1cCA9IHRydWU7Cgl9CglzZWd0cmVlW3RdLnN1bSArPSAoci1sKzEpKnNlZ3RyZWVbdF0udXBzdW07CglzZWd0cmVlW3RdLnVwc3VtID0gMDsKCXNlZ3RyZWVbdF0uaXN1cCA9IGZhbHNlOwp9CgpsbCBidWlsZChpbnQgdCxpbnQgaSxpbnQgail7CglpZihpPT1qKXsKCQlzZWd0cmVlW3RdLmluaXQoaSxqKTsKCQlzZWd0cmVlW3RdLnN1bSA9IDA7CgkJcmV0dXJuIHNlZ3RyZWVbdF0uc3VtOwoJfQoJaW50IGw9Mip0LG1pZD0oaStqKS8yOwoJbGwgYSxiOwoJYSA9IGJ1aWxkKGwsaSxtaWQpOwoJYiA9IGJ1aWxkKGwrMSxtaWQrMSxqKTsKCXNlZ3RyZWVbdF0uaW5pdChpLGopOwoJc2VndHJlZVt0XS5tZXJnZShhLGIpOwoJcmV0dXJuIHNlZ3RyZWVbdF0uc3VtOwp9CgpsbCBxdWVyeShpbnQgdCxpbnQgaSxpbnQgaixpbnQgcmksaW50IHJqKXsKCWlmKHNlZ3RyZWVbdF0uaXN1cCkKCQlzcGxpdCh0LHNlZ3RyZWVbdF0ubGZ0LHNlZ3RyZWVbdF0ucnl0KTsKCWlmKHJpIDw9aSAmJiByaj49ail7CgkJcmV0dXJuIHNlZ3RyZWVbdF0uc3VtOwoJfQoJaW50IGw9Mip0LG1pZD0oaStqKS8yOwoJaWYocmo8PW1pZCkKCQlyZXR1cm4gcXVlcnkobCxpLG1pZCxyaSxyaik7CglpZihyaT5taWQpCgkJcmV0dXJuIHF1ZXJ5KGwrMSxtaWQrMSxqLHJpLHJqKTsKCWxsIGEsYjsKCWEgPSBxdWVyeShsLGksbWlkLHJpLG1pZCk7CgliID0gcXVlcnkobCsxLG1pZCsxLGosbWlkKzEscmopOwoJcmV0dXJuIGErYjsKfQoKbGwgdXBkYXRlKGludCB0LGludCBpLGludCBqLGludCByaSxpbnQgcmosaW50IHYpewoJaWYoc2VndHJlZVt0XS5pc3VwKQoJCXNwbGl0KHQsc2VndHJlZVt0XS5sZnQsc2VndHJlZVt0XS5yeXQpOwoJaWYocmkgPD1pICYmIHJqPj1qKXsKCQlzZWd0cmVlW3RdLnVwc3VtICs9djsKCQlzZWd0cmVlW3RdLmlzdXAgPSB0cnVlOwoJCXNwbGl0KHQsc2VndHJlZVt0XS5sZnQsc2VndHJlZVt0XS5yeXQpOwoJCXJldHVybiBzZWd0cmVlW3RdLnN1bTsKCX0KCWludCBsPTIqdCxtaWQ9KGkraikvMjsKCWlmKGo8cmkgfHwgaT5yaikKICAgICAJcmV0dXJuIDA7CglsbCBhLGI7CglhID0gdXBkYXRlKGwsaSxtaWQscmkscmosdik7CgliID0gdXBkYXRlKGwrMSxtaWQrMSxqLG1pZCsxLHJqLHYpOwoJc2VndHJlZVt0XS5tZXJnZShhLGIpOwoJcmV0dXJuIHNlZ3RyZWVbdF0uc3VtOwp9CgoKaW50IG1haW4oKXsKCWludCB0LHEscCxyLGMsdjsKCWNpbj4+dDsKCXdoaWxlKHQtLSl7CgkJY2luPj5uPj5xOwoJCWJ1aWxkKDEsMSxuKTsKCQl3aGlsZShxLS0pewoJCQljaW4+PmM+PnA+PnI7CgkJCWlmKGM9PTApewoJCQkJY2luPj52OwoJCQkJdXBkYXRlKDEsMSxuLHAscix2KTsKCQkJfQoJCQllbHNlewoJCQkJY291dDw8cXVlcnkoMSwxLG4scCxyKTw8J1xuJzsKCQkJfQoJCX0KCX0KCXJldHVybiAwOwp9