#include <bits/stdc++.h>
using namespace std;
#define ll long long
ll int node[1000000];
ll int lazy[1000000];
int update(int x,int y,int l,int r,long long int v,int i){ // v should be long long int
if (lazy[i]!=0){
node[i]+=((r-l+1)*lazy[i]);
if (l!=r){
lazy[2*i+1]+=lazy[i];
lazy[2*i+2]+=lazy[i];
}
lazy[i]=0;
}
if (y<l||x>r||l>r) return 0;
if (x<=l&&y>=r){
node[i]+= ((r-l+1)*v); // here you get overflow due to int v
if (l!=r){
lazy[2*i+1]+=v;
lazy[2*i+2]+=v;
}
return 0;
}
int mid = (l+r)/2;
update(x,y,l,mid,v,2*i+1);
update(x,y,mid+1,r,v,2*i+2);
node[i] = node[2*i+1]+node[2*i+2];
return 0;
}
ll int querytree(int x,int y,int l,int r,int i){
if (lazy[i]!=0){
node[i]+=((r-l+1)*lazy[i]);
if (l!=r){
lazy[2*i+1]+=lazy[i];
lazy[2*i+2]+=lazy[i];
}
lazy[i]=0;
}
if (l>r||y<l||x>r) return 0; // apply this condition after solving lazy because there are some node which needs to be solve
if (l>=x&&r<=y) return node[i];
else{ // no need of this else because if function return value then rest of code are unreachable but its OK
int mid = (l+r)/2;
return (querytree(x,y,l,mid,2*i+1)+querytree(x,y,mid+1,r,2*i+2));
}
}
int main(){
int t;
scanf("%d",&t);
while (t--){
int n,query;
scanf("%d%d",&n,&query);
while (query--){
int ch,p,q;
scanf("%d%d%d",&ch,&p,&q);
p--;
q--;
if (ch==0){
long long int v;
scanf("%lld",&v);
update(p,q,0,n-1,v,0);
}
else{
printf("%lld\n",querytree(p,q,0,n-1,0));
}
}
memset(node,0,sizeof(node));
memset(lazy,0,sizeof(lazy));
}
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CiNkZWZpbmUgbGwgbG9uZyBsb25nCgpsbCBpbnQgbm9kZVsxMDAwMDAwXTsKbGwgaW50IGxhenlbMTAwMDAwMF07CgppbnQgdXBkYXRlKGludCB4LGludCB5LGludCBsLGludCByLGxvbmcgbG9uZyBpbnQgdixpbnQgaSl7IC8vIHYgc2hvdWxkIGJlIGxvbmcgbG9uZyBpbnQKCWlmIChsYXp5W2ldIT0wKXsKCQlub2RlW2ldKz0oKHItbCsxKSpsYXp5W2ldKTsKCQlpZiAobCE9cil7CgkJCWxhenlbMippKzFdKz1sYXp5W2ldOwoJCQlsYXp5WzIqaSsyXSs9bGF6eVtpXTsKCQl9CgkJbGF6eVtpXT0wOwoJfQoJaWYgKHk8bHx8eD5yfHxsPnIpIHJldHVybiAwOwoJaWYgKHg8PWwmJnk+PXIpewoJCW5vZGVbaV0rPSAoKHItbCsxKSp2KTsgLy8gaGVyZSB5b3UgZ2V0IG92ZXJmbG93IGR1ZSB0byBpbnQgdgoJCWlmIChsIT1yKXsKCQkJbGF6eVsyKmkrMV0rPXY7CgkJCWxhenlbMippKzJdKz12OwoJCX0KCQlyZXR1cm4gMDsKCX0KCWludCBtaWQgPSAobCtyKS8yOwoJdXBkYXRlKHgseSxsLG1pZCx2LDIqaSsxKTsKCXVwZGF0ZSh4LHksbWlkKzEscix2LDIqaSsyKTsKCW5vZGVbaV0gPSBub2RlWzIqaSsxXStub2RlWzIqaSsyXTsKCXJldHVybiAwOwp9CgpsbCBpbnQgcXVlcnl0cmVlKGludCB4LGludCB5LGludCBsLGludCByLGludCBpKXsKCWlmIChsYXp5W2ldIT0wKXsKCQlub2RlW2ldKz0oKHItbCsxKSpsYXp5W2ldKTsKCQlpZiAobCE9cil7CgkJCWxhenlbMippKzFdKz1sYXp5W2ldOwoJCQlsYXp5WzIqaSsyXSs9bGF6eVtpXTsKCQl9CgkJbGF6eVtpXT0wOwoJfQoKCWlmIChsPnJ8fHk8bHx8eD5yKSByZXR1cm4gMDsgLy8gYXBwbHkgdGhpcyBjb25kaXRpb24gYWZ0ZXIgc29sdmluZyBsYXp5IGJlY2F1c2UgdGhlcmUgYXJlIHNvbWUgbm9kZSB3aGljaCBuZWVkcyB0byBiZSBzb2x2ZQoKCWlmIChsPj14JiZyPD15KSByZXR1cm4gbm9kZVtpXTsKCWVsc2V7IC8vIG5vIG5lZWQgb2YgdGhpcyBlbHNlIGJlY2F1c2UgaWYgZnVuY3Rpb24gcmV0dXJuIHZhbHVlIHRoZW4gcmVzdCBvZiBjb2RlIGFyZSB1bnJlYWNoYWJsZSBidXQgaXRzIE9LCgkJaW50IG1pZCA9IChsK3IpLzI7CgkJcmV0dXJuIChxdWVyeXRyZWUoeCx5LGwsbWlkLDIqaSsxKStxdWVyeXRyZWUoeCx5LG1pZCsxLHIsMippKzIpKTsKCX0KfQoKaW50IG1haW4oKXsKCWludCB0OwoJc2NhbmYoIiVkIiwmdCk7Cgl3aGlsZSAodC0tKXsKCQlpbnQgbixxdWVyeTsKCQlzY2FuZigiJWQlZCIsJm4sJnF1ZXJ5KTsKCQl3aGlsZSAocXVlcnktLSl7CgkJCWludCBjaCxwLHE7CgkJCXNjYW5mKCIlZCVkJWQiLCZjaCwmcCwmcSk7CgkJCXAtLTsKCQkJcS0tOwoJCQlpZiAoY2g9PTApewoJCQkJbG9uZyBsb25nIGludCB2OwoJCQkJc2NhbmYoIiVsbGQiLCZ2KTsKCQkJCXVwZGF0ZShwLHEsMCxuLTEsdiwwKTsKCQkJfQoJCQllbHNlewoJCQkJcHJpbnRmKCIlbGxkXG4iLHF1ZXJ5dHJlZShwLHEsMCxuLTEsMCkpOwoJCQl9CgkJfQoJCW1lbXNldChub2RlLDAsc2l6ZW9mKG5vZGUpKTsKCQltZW1zZXQobGF6eSwwLHNpemVvZihsYXp5KSk7Cgl9CglyZXR1cm4gMDsKfQo=