#include <iostream>
#include<cstdio>
#include<cmath>
#include<string.h>
using namespace std;
#define ll long long
#define MAX 100005
struct node{
ll sum,upval;
bool up;
node():sum(0),upval(0),up(false){}
node(ll a):sum(a),upval(0),up(false){}
void merge(node a,node b){
sum = a.sum+b.sum;
}
void pass(int len,int v){
sum +=(len*v);
upval +=v;
up = true;
}
};
node segtree[4*MAX];
void build(int t,int i,int j){
if(i==j){
segtree[t] = node();
return;
}
int l=2*t,mid=(i+j)/2;
build(l,i,mid);
build(l+1,mid+1,j);
}
void update(int t,int i,int j,int ri,int rj,int v){
if(ri<=i && rj>=j){
segtree[t].pass((j-i+1),v);
return;
}
if(j<ri || i>rj)
return;
int l=2*t,mid=(i+j)/2;
update(l,i,mid,ri,rj,v);
update(l+1,mid+1,j,ri,rj,v);
segtree[t].merge(segtree[l],segtree[l+1]);
}
ll query(int t,int i,int j,int ri,int rj){
if(ri<=i && rj>=j)
return segtree[t].sum;
if(j<ri || i>rj)
return 0;
int l=2*t,mid=(i+j)/2;
if(segtree[t].up){
segtree[l].pass((mid-i+1),segtree[t].upval);
segtree[l+1].pass((j-mid),segtree[t].upval);
segtree[t].upval=0;
segtree[t].up = false;
}
return query(l,i,mid,ri,rj)+query(l+1,mid+1,j,ri,rj);
}
int main() {
int t,n,c,a,p,q,v;
scanf("%d",&t);
while(t--){
scanf("%d%d",&n,&c);
//build(1,1,2*pow(2,log2(n)+1));
while(c--){
scanf("%d%d%d",&a,&p,&q);
if(a==0){
scanf("%d",&v);
update(1,1,n,p,q,v);
}
else if(a==1)
printf("%lld\n",query(1,1,n,p,q));
}
memset(segtree,0,sizeof(segtree));
}
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZTxjc3RkaW8+CiNpbmNsdWRlPGNtYXRoPgojaW5jbHVkZTxzdHJpbmcuaD4KCnVzaW5nIG5hbWVzcGFjZSBzdGQ7CiNkZWZpbmUgbGwgbG9uZyBsb25nCiNkZWZpbmUgTUFYIDEwMDAwNQoKc3RydWN0IG5vZGV7CiAgICBsbCBzdW0sdXB2YWw7CiAgICBib29sIHVwOwogICAgbm9kZSgpOnN1bSgwKSx1cHZhbCgwKSx1cChmYWxzZSl7fQogICAgbm9kZShsbCBhKTpzdW0oYSksdXB2YWwoMCksdXAoZmFsc2Upe30KICAgIHZvaWQgbWVyZ2Uobm9kZSBhLG5vZGUgYil7CiAgICAgICAgc3VtID0gYS5zdW0rYi5zdW07CiAgICB9CiAgICB2b2lkIHBhc3MoaW50IGxlbixpbnQgdil7CiAgICAgICAgc3VtICs9KGxlbip2KTsKICAgICAgICB1cHZhbCArPXY7CiAgICAgICAgdXAgPSB0cnVlOwogICAgfQp9OwoKbm9kZSBzZWd0cmVlWzQqTUFYXTsKCnZvaWQgYnVpbGQoaW50IHQsaW50IGksaW50IGopewogICAgaWYoaT09ail7CiAgICAgICAgc2VndHJlZVt0XSA9IG5vZGUoKTsKICAgICAgICByZXR1cm47CiAgICB9CiAgICBpbnQgbD0yKnQsbWlkPShpK2opLzI7CiAgICBidWlsZChsLGksbWlkKTsKICAgIGJ1aWxkKGwrMSxtaWQrMSxqKTsKfQoKdm9pZCB1cGRhdGUoaW50IHQsaW50IGksaW50IGosaW50IHJpLGludCByaixpbnQgdil7CiAgICBpZihyaTw9aSAmJiByaj49ail7CiAgICAgICAgc2VndHJlZVt0XS5wYXNzKChqLWkrMSksdik7CiAgICAgICAgcmV0dXJuOwogICAgfQogICAgaWYoajxyaSB8fCBpPnJqKQogICAgICAgIHJldHVybjsKICAgIGludCBsPTIqdCxtaWQ9KGkraikvMjsKICAgIHVwZGF0ZShsLGksbWlkLHJpLHJqLHYpOwogICAgdXBkYXRlKGwrMSxtaWQrMSxqLHJpLHJqLHYpOwogICAgc2VndHJlZVt0XS5tZXJnZShzZWd0cmVlW2xdLHNlZ3RyZWVbbCsxXSk7CiAgICAgICAgCn0KCmxsIHF1ZXJ5KGludCB0LGludCBpLGludCBqLGludCByaSxpbnQgcmopewogICAgaWYocmk8PWkgJiYgcmo+PWopCiAgICAgICAgcmV0dXJuIHNlZ3RyZWVbdF0uc3VtOwogICAgaWYoajxyaSB8fCBpPnJqKQogICAgICAgIHJldHVybiAwOwogICAgaW50IGw9Mip0LG1pZD0oaStqKS8yOwogICAgaWYoc2VndHJlZVt0XS51cCl7CiAgICAgICAgc2VndHJlZVtsXS5wYXNzKChtaWQtaSsxKSxzZWd0cmVlW3RdLnVwdmFsKTsKICAgICAgICBzZWd0cmVlW2wrMV0ucGFzcygoai1taWQpLHNlZ3RyZWVbdF0udXB2YWwpOwogICAgICAgIHNlZ3RyZWVbdF0udXB2YWw9MDsKICAgICAgICBzZWd0cmVlW3RdLnVwID0gZmFsc2U7CiAgICB9CiAgICByZXR1cm4gcXVlcnkobCxpLG1pZCxyaSxyaikrcXVlcnkobCsxLG1pZCsxLGoscmkscmopOwp9CgoKCmludCBtYWluKCkgewoJaW50IHQsbixjLGEscCxxLHY7CiAgICBzY2FuZigiJWQiLCZ0KTsKICAgIHdoaWxlKHQtLSl7CiAgICAgICAgc2NhbmYoIiVkJWQiLCZuLCZjKTsKICAgICAgICAvL2J1aWxkKDEsMSwyKnBvdygyLGxvZzIobikrMSkpOwogICAgICAgIHdoaWxlKGMtLSl7CiAgICAgICAgICAgIHNjYW5mKCIlZCVkJWQiLCZhLCZwLCZxKTsKICAgICAgICAgICAgaWYoYT09MCl7CiAgICAgICAgICAgICAgICBzY2FuZigiJWQiLCZ2KTsKICAgICAgICAgICAgICAgIHVwZGF0ZSgxLDEsbixwLHEsdik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZihhPT0xKQogICAgICAgICAgICAgICAgcHJpbnRmKCIlbGxkXG4iLHF1ZXJ5KDEsMSxuLHAscSkpOwogICAgICAgIH0KICAgICAgICBtZW1zZXQoc2VndHJlZSwwLHNpemVvZihzZWd0cmVlKSk7CiAgICB9CglyZXR1cm4gMDsKfQ==