#include <iostream>
#include <cstdio>
using namespace std;
#define ll long long
class node
{
public:
int left_r,right_r;
ll sum,count;
node *left,*right;
node() {
left_r=right_r=0;
sum=count=0;
left=right=NULL;
}
};
void maketree(int lower,int higher,node *current)
{
current->left_r=lower;
current->right_r=higher;
if(lower!=higher) {
node *leftt=new node();
node *rightt=new node();
current->left=leftt;
current->right=rightt;
maketree(lower,(lower+higher)/2,current->left);
maketree((lower+higher)/2+1,higher,current->right);
}
// cout<<"heloo\n";
}
void add_up(node *current,node *left,node *right)
{
current->sum=(current->left->sum+current->left->count*(current->left->right_r - current->left->left_r+1)) ;
current->sum=current->sum + (current->right->sum+current->right->count*(current->right->right_r-current->right->left_r+1));
}
ll countRMQ(int low,int high,node *current)
{
if(current->count!=0) {
current->sum+=(current->right_r-current->left_r+1)*current->count;
if(current->left!=NULL) {
current->left->count+=current->count;
current->right->count+=current->count;
}
current->count=0;
}
if(low==current->left_r&&high==current->right_r) {
return current->sum+current->count*(current->right_r-current->left_r+1);
}
int mid=(current->left_r+current->right_r)/2;
if(low>mid) {
return countRMQ(low,high,current->right);
} else if(mid>=high) {
return countRMQ(low,high,current->left);
} else {
return (countRMQ(low,mid,current->left)+countRMQ(mid+1,high,current->right));
}
}
void updateRMQ(int low,int high,node *current,int add)
{
if(current->count!=0) {
current->sum=current->sum+(current->right_r-current->left_r+1)*current->count;
if(current->left!=NULL) {
current->left->count+=current->count;
current->right->count+=current->count;
}
current->count=0;
}
if(low==current->left_r&&high==current->right_r) {
current->sum=current->sum+(current->right_r-current->left_r+1)*add;
current->count=0;
if(current->left!=NULL) {
current->left->count+=add;
current->right->count+=add;
}
return ;
} else {
int mid=(current->left_r+current->right_r)/2;
if(low>mid) {
updateRMQ(low,high,current->right,add);
} else if(mid>=high) {
updateRMQ(low,high,current->left,add);
} else {
updateRMQ(low,mid,current->left,add);
updateRMQ(mid+1,high,current->right,add);
}
add_up(current,current->left,current->right);
}
}
int main()
{
int tst;
scanf("%d",&tst);
while(tst--) {
int N,Q;
scanf("%d%d",&N,&Q);
node *top=new node();
maketree(0,N-1,top);
// printf("pankaj\n");
while(Q--) {
int q,low,high,add;
scanf("%d%d%d",&q,&low,&high);
if(q) {
printf("%lld\n",countRMQ(low-1,high-1,top));
} else {
scanf("%d",&add);
updateRMQ(low-1,high-1,top,add);
}
}
}
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8Y3N0ZGlvPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwojZGVmaW5lIGxsIGxvbmcgbG9uZwpjbGFzcyBub2RlCnsKcHVibGljOgogICAgICAgIGludCBsZWZ0X3IscmlnaHRfcjsKICAgICAgICBsbCBzdW0sY291bnQ7CiAgICAgICAgbm9kZSAqbGVmdCwqcmlnaHQ7CiAgICAgICAgbm9kZSgpIHsKICAgICAgICAgICAgICAgIGxlZnRfcj1yaWdodF9yPTA7CiAgICAgICAgICAgICAgICBzdW09Y291bnQ9MDsKICAgICAgICAgICAgICAgIGxlZnQ9cmlnaHQ9TlVMTDsKICAgICAgICB9Cn07CnZvaWQgbWFrZXRyZWUoaW50IGxvd2VyLGludCBoaWdoZXIsbm9kZSAqY3VycmVudCkKewogICAgICAgIGN1cnJlbnQtPmxlZnRfcj1sb3dlcjsKICAgICAgICBjdXJyZW50LT5yaWdodF9yPWhpZ2hlcjsKICAgICAgICBpZihsb3dlciE9aGlnaGVyKSB7CiAgICAgICAgICAgICAgICBub2RlICpsZWZ0dD1uZXcgbm9kZSgpOwogICAgICAgICAgICAgICAgbm9kZSAqcmlnaHR0PW5ldyBub2RlKCk7CiAgICAgICAgICAgICAgICBjdXJyZW50LT5sZWZ0PWxlZnR0OwogICAgICAgICAgICAgICAgY3VycmVudC0+cmlnaHQ9cmlnaHR0OwogICAgICAgICAgICAgICAgbWFrZXRyZWUobG93ZXIsKGxvd2VyK2hpZ2hlcikvMixjdXJyZW50LT5sZWZ0KTsKICAgICAgICAgICAgICAgIG1ha2V0cmVlKChsb3dlcitoaWdoZXIpLzIrMSxoaWdoZXIsY3VycmVudC0+cmlnaHQpOwogICAgICAgIH0KICAgICAgIC8vIGNvdXQ8PCJoZWxvb1xuIjsKfQp2b2lkIGFkZF91cChub2RlICpjdXJyZW50LG5vZGUgKmxlZnQsbm9kZSAqcmlnaHQpCnsKICAgICAgICBjdXJyZW50LT5zdW09KGN1cnJlbnQtPmxlZnQtPnN1bStjdXJyZW50LT5sZWZ0LT5jb3VudCooY3VycmVudC0+bGVmdC0+cmlnaHRfciAtIGN1cnJlbnQtPmxlZnQtPmxlZnRfcisxKSkgOwogICAgICAgIGN1cnJlbnQtPnN1bT1jdXJyZW50LT5zdW0gKyAoY3VycmVudC0+cmlnaHQtPnN1bStjdXJyZW50LT5yaWdodC0+Y291bnQqKGN1cnJlbnQtPnJpZ2h0LT5yaWdodF9yLWN1cnJlbnQtPnJpZ2h0LT5sZWZ0X3IrMSkpOwp9CmxsIGNvdW50Uk1RKGludCBsb3csaW50IGhpZ2gsbm9kZSAqY3VycmVudCkKewogICAgICAgIGlmKGN1cnJlbnQtPmNvdW50IT0wKSB7CiAgICAgICAgICAgICAgICBjdXJyZW50LT5zdW0rPShjdXJyZW50LT5yaWdodF9yLWN1cnJlbnQtPmxlZnRfcisxKSpjdXJyZW50LT5jb3VudDsKICAgICAgICAgICAgICAgIGlmKGN1cnJlbnQtPmxlZnQhPU5VTEwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudC0+bGVmdC0+Y291bnQrPWN1cnJlbnQtPmNvdW50OwogICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50LT5yaWdodC0+Y291bnQrPWN1cnJlbnQtPmNvdW50OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY3VycmVudC0+Y291bnQ9MDsKICAgICAgICB9CiAgICAgICAgaWYobG93PT1jdXJyZW50LT5sZWZ0X3ImJmhpZ2g9PWN1cnJlbnQtPnJpZ2h0X3IpIHsKICAgICAgICAgICAgICAgIHJldHVybiBjdXJyZW50LT5zdW0rY3VycmVudC0+Y291bnQqKGN1cnJlbnQtPnJpZ2h0X3ItY3VycmVudC0+bGVmdF9yKzEpOwogICAgICAgIH0KICAgICAgICBpbnQgbWlkPShjdXJyZW50LT5sZWZ0X3IrY3VycmVudC0+cmlnaHRfcikvMjsKICAgICAgICBpZihsb3c+bWlkKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gY291bnRSTVEobG93LGhpZ2gsY3VycmVudC0+cmlnaHQpOwogICAgICAgIH0gZWxzZSBpZihtaWQ+PWhpZ2gpIHsKICAgICAgICAgICAgICAgIHJldHVybiBjb3VudFJNUShsb3csaGlnaCxjdXJyZW50LT5sZWZ0KTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgcmV0dXJuIChjb3VudFJNUShsb3csbWlkLGN1cnJlbnQtPmxlZnQpK2NvdW50Uk1RKG1pZCsxLGhpZ2gsY3VycmVudC0+cmlnaHQpKTsKICAgICAgICB9Cn0Kdm9pZCB1cGRhdGVSTVEoaW50IGxvdyxpbnQgaGlnaCxub2RlICpjdXJyZW50LGludCBhZGQpCnsKICAgICAgICBpZihjdXJyZW50LT5jb3VudCE9MCkgewogICAgICAgICAgICAgICAgY3VycmVudC0+c3VtPWN1cnJlbnQtPnN1bSsoY3VycmVudC0+cmlnaHRfci1jdXJyZW50LT5sZWZ0X3IrMSkqY3VycmVudC0+Y291bnQ7CiAgICAgICAgICAgICAgICBpZihjdXJyZW50LT5sZWZ0IT1OVUxMKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQtPmxlZnQtPmNvdW50Kz1jdXJyZW50LT5jb3VudDsKICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudC0+cmlnaHQtPmNvdW50Kz1jdXJyZW50LT5jb3VudDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGN1cnJlbnQtPmNvdW50PTA7CiAgICAgICAgfQogICAgICAgIGlmKGxvdz09Y3VycmVudC0+bGVmdF9yJiZoaWdoPT1jdXJyZW50LT5yaWdodF9yKSB7CiAgICAgICAgICAgICAgICBjdXJyZW50LT5zdW09Y3VycmVudC0+c3VtKyhjdXJyZW50LT5yaWdodF9yLWN1cnJlbnQtPmxlZnRfcisxKSphZGQ7CiAgICAgICAgICAgICAgICBjdXJyZW50LT5jb3VudD0wOwogICAgICAgICAgICAgICAgaWYoY3VycmVudC0+bGVmdCE9TlVMTCkgewogICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50LT5sZWZ0LT5jb3VudCs9YWRkOwogICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50LT5yaWdodC0+Y291bnQrPWFkZDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiA7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGludCBtaWQ9KGN1cnJlbnQtPmxlZnRfcitjdXJyZW50LT5yaWdodF9yKS8yOwogICAgICAgICAgICAgICAgaWYobG93Pm1pZCkgewogICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVSTVEobG93LGhpZ2gsY3VycmVudC0+cmlnaHQsYWRkKTsKICAgICAgICAgICAgICAgIH0gZWxzZSBpZihtaWQ+PWhpZ2gpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlUk1RKGxvdyxoaWdoLGN1cnJlbnQtPmxlZnQsYWRkKTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZVJNUShsb3csbWlkLGN1cnJlbnQtPmxlZnQsYWRkKTsKICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlUk1RKG1pZCsxLGhpZ2gsY3VycmVudC0+cmlnaHQsYWRkKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGFkZF91cChjdXJyZW50LGN1cnJlbnQtPmxlZnQsY3VycmVudC0+cmlnaHQpOwogICAgICAgIH0KfQppbnQgbWFpbigpCnsKICAgICAgICBpbnQgdHN0OwogICAgICAgIHNjYW5mKCIlZCIsJnRzdCk7CiAgICAgICAgd2hpbGUodHN0LS0pIHsKICAgICAgICAgICAgICAgIGludCBOLFE7CiAgICAgICAgICAgICAgICBzY2FuZigiJWQlZCIsJk4sJlEpOwogICAgICAgICAgICAgICAgbm9kZSAqdG9wPW5ldyBub2RlKCk7CiAgICAgICAgICAgICAgICBtYWtldHJlZSgwLE4tMSx0b3ApOwogICAgICAgICAvLyAgICAgICBwcmludGYoInBhbmthalxuIik7CiAgICAgICAgICAgICAgICB3aGlsZShRLS0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgaW50IHEsbG93LGhpZ2gsYWRkOwogICAgICAgICAgICAgICAgICAgICAgICBzY2FuZigiJWQlZCVkIiwmcSwmbG93LCZoaWdoKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYocSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiJWxsZFxuIixjb3VudFJNUShsb3ctMSxoaWdoLTEsdG9wKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbmYoIiVkIiwmYWRkKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVSTVEobG93LTEsaGlnaC0xLHRvcCxhZGQpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiAwOwp9Cg==