#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,int v,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 (y<l||x>r||l>r) return 0;
if (x<=l&&y>=r){
node[i]+= ((r-l+1)*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 (l>r) return 0;
if (y<l||x>r) return 0;
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>=x&&r<=y) return node[i];
else{
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){
int v;
scanf("%d",&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+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CiNkZWZpbmUgbGwgbG9uZyBsb25nCgpsbCBpbnQgbm9kZVsxMDAwMDAwXTsKbGwgaW50IGxhenlbMTAwMDAwMF07CgppbnQgdXBkYXRlKGludCB4LGludCB5LGludCBsLGludCByLGludCB2LGludCBpKXsKCWlmIChsYXp5W2ldIT0wKXsKCQlub2RlW2ldKz0oKHItbCsxKSpsYXp5W2ldKTsKCQlpZiAobCE9cil7CgkJCWxhenlbMippKzFdKz1sYXp5W2ldOwoJCQlsYXp5WzIqaSsyXSs9bGF6eVtpXTsKCQl9CgkJbGF6eVtpXT0wOwoJfQoJaWYgKHk8bHx8eD5yfHxsPnIpIHJldHVybiAwOwoJaWYgKHg8PWwmJnk+PXIpewoJCW5vZGVbaV0rPSAoKHItbCsxKSp2KTsKCQlpZiAobCE9cil7CgkJCWxhenlbMippKzFdKz12OwoJCQlsYXp5WzIqaSsyXSs9djsKCQl9CgkJcmV0dXJuIDA7Cgl9CglpbnQgbWlkID0gKGwrcikvMjsKCXVwZGF0ZSh4LHksbCxtaWQsdiwyKmkrMSk7Cgl1cGRhdGUoeCx5LG1pZCsxLHIsdiwyKmkrMik7Cglub2RlW2ldID0gbm9kZVsyKmkrMV0rbm9kZVsyKmkrMl07CglyZXR1cm4gMDsKfQoKbGwgaW50IHF1ZXJ5dHJlZShpbnQgeCxpbnQgeSxpbnQgbCxpbnQgcixpbnQgaSl7CglpZiAobD5yKSByZXR1cm4gMDsKCWlmICh5PGx8fHg+cikgcmV0dXJuIDA7CglpZiAobGF6eVtpXSE9MCl7CgkJbm9kZVtpXSs9KChyLWwrMSkqbGF6eVtpXSk7CgkJaWYgKGwhPXIpewoJCQlsYXp5WzIqaSsxXSs9bGF6eVtpXTsKCQkJbGF6eVsyKmkrMl0rPWxhenlbaV07CgkJfQoJCWxhenlbaV09MDsKCX0KCWlmIChsPj14JiZyPD15KSByZXR1cm4gbm9kZVtpXTsKCWVsc2V7CgkJaW50IG1pZCA9IChsK3IpLzI7CgkJcmV0dXJuIChxdWVyeXRyZWUoeCx5LGwsbWlkLDIqaSsxKStxdWVyeXRyZWUoeCx5LG1pZCsxLHIsMippKzIpKTsKCX0KfQoKaW50IG1haW4oKXsKCWludCB0OwoJc2NhbmYoIiVkIiwmdCk7Cgl3aGlsZSAodC0tKXsKCQlpbnQgbixxdWVyeTsKCQlzY2FuZigiJWQlZCIsJm4sJnF1ZXJ5KTsKCQl3aGlsZSAocXVlcnktLSl7CgkJCWludCBjaCxwLHE7CgkJCXNjYW5mKCIlZCVkJWQiLCZjaCwmcCwmcSk7CgkJCXAtLTsKCQkJcS0tOwoJCQlpZiAoY2g9PTApewoJCQkJaW50IHY7CgkJCQlzY2FuZigiJWQiLCZ2KTsKCQkJCXVwZGF0ZShwLHEsMCxuLTEsdiwwKTsKCQkJfQoJCQllbHNlewoJCQkJcHJpbnRmKCIlbGxkXG4iLHF1ZXJ5dHJlZShwLHEsMCxuLTEsMCkpOwoJCQl9CgkJfQoJCW1lbXNldChub2RlLDAsc2l6ZW9mKG5vZGUpKTsKCQltZW1zZXQobGF6eSwwLHNpemVvZihsYXp5KSk7Cgl9CglyZXR1cm4gMDsKfQo=