#include<iostream>
#define MAX 262145
using namespace std;
typedef long long LL;
LL n,m;
struct tree{
LL add;
LL total;
}T[MAX];
void update(LL Node,LL left,LL right,LL i,LL j,LL v){
if(left > j || right < i) return;
if(T[Node].add > 0){
if(left != right){
LL L = Node<<1 , R = L+1;
T[L].add += T[Node].add;
T[R].add += T[Node].add;
}
T[Node].total += T[Node].add*(right-left+1);
T[Node].add = 0;
}
if(left >= i && right <= j){
if(left != right){
LL L = Node<<1 , R = L+1;
T[L].add += v;
T[R].add += v;
}
T[Node].total += (right-left+1)*v;
return;
}
LL mid=(left + right)>>1, L = Node<<1 , R = L+1;
{ update(L,left,mid,i,j,v);
update(R,mid+1,right,i,j,v);
T[Node].total+=T[Node*2].total+T[Node*2+1].total;}
}
LL query(LL Node,LL left,LL right,LL i,LL j){
if(left > j || right < i) return 0;
if(T[Node].add > 0){
if(left != right){
LL L = Node<<1 , R = L+1;
T[L].add += T[Node].add;
T[R].add += T[Node].add;
}
T[Node].total += T[Node].add*(right-left+1);
T[Node].add = 0;
}
if(left >= i && right <= j)return T[Node].total;
LL mid = (right+left)/2, L = Node<<1 , R = L+1;
LL ret =0;
ret+= query(L,left,mid,i,j);
ret+= query(R,mid+1,right,i,j);
return ret;
}
int main(){
LL t;
cin >> t;
while(t--){
cin >> n >> m;
for(LL i=0;i<MAX;i++)
T[i].total = T[i].add = 0;
while(m--){
LL q,a,b,k;
cin >> q >> a >> b;
switch(q){
case 0:cin >> k;
update(1,1,MAX/2,a,b,k);break;
case 1:cout << query(1,1,MAX/2,a,b) << endl;break;
}
}
}
return 0;
}
I2luY2x1ZGU8aW9zdHJlYW0+CiAKI2RlZmluZSBNQVggMjYyMTQ1CiAKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKIAp0eXBlZGVmIGxvbmcgbG9uZyBMTDsKTEwgbixtOwpzdHJ1Y3QgdHJlZXsKTEwgYWRkOwpMTCB0b3RhbDsKfVRbTUFYXTsKIAp2b2lkIHVwZGF0ZShMTCBOb2RlLExMIGxlZnQsTEwgcmlnaHQsTEwgaSxMTCBqLExMIHYpewogICAgaWYobGVmdCA+IGogfHwgcmlnaHQgPCBpKSByZXR1cm47CiAgICBpZihUW05vZGVdLmFkZCA+IDApewogICAgICAgIGlmKGxlZnQgIT0gcmlnaHQpewogICAgICAgICAgICBMTCBMID0gTm9kZTw8MSAsIFIgPSBMKzE7CiAgICAgICAgICAgIFRbTF0uYWRkICs9IFRbTm9kZV0uYWRkOwogICAgICAgICAgICBUW1JdLmFkZCArPSBUW05vZGVdLmFkZDsKCSAgICB9CiAKICAgICAgICBUW05vZGVdLnRvdGFsICs9IFRbTm9kZV0uYWRkKihyaWdodC1sZWZ0KzEpOwogICAgICAgIFRbTm9kZV0uYWRkID0gMDsKICAgIH0KCWlmKGxlZnQgPj0gaSAmJiByaWdodCA8PSBqKXsKCSAgICBpZihsZWZ0ICE9IHJpZ2h0KXsKICAgICAgICAgICAgTEwgTCA9IE5vZGU8PDEgLCBSID0gTCsxOwogICAgICAgICAgICBUW0xdLmFkZCArPSB2OwogICAgICAgICAgICBUW1JdLmFkZCArPSB2OwoJICAgIH0KIAoJCVRbTm9kZV0udG90YWwgKz0gKHJpZ2h0LWxlZnQrMSkqdjsKCQlyZXR1cm47Cgl9CiAKCUxMIG1pZD0obGVmdCArIHJpZ2h0KT4+MSwgTCA9IE5vZGU8PDEgLCBSID0gTCsxOwogICB7IHVwZGF0ZShMLGxlZnQsbWlkLGksaix2KTsKICAgIHVwZGF0ZShSLG1pZCsxLHJpZ2h0LGksaix2KTsKCVRbTm9kZV0udG90YWwrPVRbTm9kZSoyXS50b3RhbCtUW05vZGUqMisxXS50b3RhbDt9Cn0KIApMTCBxdWVyeShMTCBOb2RlLExMIGxlZnQsTEwgcmlnaHQsTEwgaSxMTCBqKXsKICAgIGlmKGxlZnQgPiBqIHx8IHJpZ2h0IDwgaSkgcmV0dXJuIDA7CiAKICAgIGlmKFRbTm9kZV0uYWRkID4gMCl7CiAgICAgICAgaWYobGVmdCAhPSByaWdodCl7CiAgICAgICAgICAgIExMIEwgPSBOb2RlPDwxICwgUiA9IEwrMTsKICAgICAgICAgICAgVFtMXS5hZGQgKz0gVFtOb2RlXS5hZGQ7CiAgICAgICAgICAgIFRbUl0uYWRkICs9IFRbTm9kZV0uYWRkOwoJICAgIH0KIAogICAgICAgIFRbTm9kZV0udG90YWwgKz0gVFtOb2RlXS5hZGQqKHJpZ2h0LWxlZnQrMSk7CiAgICAgICAgVFtOb2RlXS5hZGQgPSAwOwogICAgfQogCiAgICBpZihsZWZ0ID49IGkgJiYgcmlnaHQgPD0gailyZXR1cm4gVFtOb2RlXS50b3RhbDsKIAogICAgTEwgbWlkID0gKHJpZ2h0K2xlZnQpLzIsIEwgPSBOb2RlPDwxICwgUiA9IEwrMTsKICAgIExMIHJldCA9MDsKICAgIHJldCs9IHF1ZXJ5KEwsbGVmdCxtaWQsaSxqKTsKICAgIHJldCs9IHF1ZXJ5KFIsbWlkKzEscmlnaHQsaSxqKTsKICAgIHJldHVybiByZXQ7Cn0KIAppbnQgbWFpbigpewpMTCB0OwpjaW4gPj4gdDsKd2hpbGUodC0tKXsKY2luID4+IG4gPj4gbTsKCWZvcihMTCBpPTA7aTxNQVg7aSsrKQoJCVRbaV0udG90YWwgPSBUW2ldLmFkZCA9IDA7CndoaWxlKG0tLSl7CglMTCBxLGEsYixrOwoJY2luID4+IHEgPj4gYSA+PiBiOwoJCXN3aXRjaChxKXsKCQkJY2FzZSAwOmNpbiA+PiBrOwoJCQkJdXBkYXRlKDEsMSxNQVgvMixhLGIsayk7YnJlYWs7CgkJCWNhc2UgMTpjb3V0IDw8IHF1ZXJ5KDEsMSxNQVgvMixhLGIpIDw8IGVuZGw7YnJlYWs7CgkJfQp9Cn0KcmV0dXJuIDA7Cn0g