#include<iostream>
using namespace std;
long long int a[10000000];
long long int segtree[450000];
long long int lazy[450000];
void updatetree(int low,int high,int value,int qlow,int qhigh,int pos);
int main()
{
std::ios::sync_with_stdio(false);// std::ios in codeblock
int t,b;
long long int n,c,p,q,v,i;
cin>>t;
while(t--)
{
// memset(lazy,0,sizeof(lazy));
cin>>n>>c;
for(i=0;i<450000;i++)
{
lazy[i]=0;
segtree[i]=0;
}
for(i=0;i<n;i++)
a[i]=0;
for(i=0;i<c;i++)
{
cin>>b;
if(b==0)
{
cin>>p>>q>>v;
updatetree(0,n-1,v,p,q,0);// constant value should be from right side
}
/* else
{
cin>>p>>q;
addtree(p,q);
}*/
}
}
return 0;
}
void updatetree(int low,int high,int value,int qlow,int qhigh,int pos)
{
if(lazy[pos]!=0)
{
segtree[pos]+=lazy[pos];
if(low!=high)
{
lazy[2*pos+1]+=lazy[pos];
lazy[2*pos+2]+=lazy[pos];
}
lazy[pos]=0;
}
if(low>qhigh||high<qlow) return;// later addition
if(qlow<=low&&qhigh>=high)
{
segtree[pos]+=value;
if(low!=high)
{
lazy[2*pos+1]+=value;
lazy[2*pos+2]+=value;
}
return ;
}
//if partial overlaps
int mid;
mid=(low+high)/2;
updatetree(low,mid,value,qlow,qhigh,2*pos+1);
updatetree(mid+1,high,value,qlow,qhigh,2+pos+2);
segtree[pos]=min(segtree[2*pos+1],segtree[2*pos+2]);
}
I2luY2x1ZGU8aW9zdHJlYW0+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CmxvbmcgbG9uZyBpbnQgYVsxMDAwMDAwMF07CmxvbmcgbG9uZyBpbnQgc2VndHJlZVs0NTAwMDBdOwpsb25nIGxvbmcgaW50IGxhenlbNDUwMDAwXTsKdm9pZCB1cGRhdGV0cmVlKGludCBsb3csaW50IGhpZ2gsaW50IHZhbHVlLGludCBxbG93LGludCBxaGlnaCxpbnQgcG9zKTsKaW50IG1haW4oKQogewogICBzdGQ6Omlvczo6c3luY193aXRoX3N0ZGlvKGZhbHNlKTsvLyBzdGQ6OmlvcyBpbiBjb2RlYmxvY2sKICAgaW50IHQsYjsKICAgbG9uZyBsb25nIGludCAgbixjLHAscSx2LGk7CiAgIGNpbj4+dDsKICAgd2hpbGUodC0tKQogICB7CiAgIC8vICAgIG1lbXNldChsYXp5LDAsc2l6ZW9mKGxhenkpKTsKICAgICAgIGNpbj4+bj4+YzsKICAgICAgIGZvcihpPTA7aTw0NTAwMDA7aSsrKQogICAgICAgewogICAgICAgICAgIGxhenlbaV09MDsKICAgICAgICAgICBzZWd0cmVlW2ldPTA7CiAgICAgICB9CiAgICAgICBmb3IoaT0wO2k8bjtpKyspCiAgICAgICBhW2ldPTA7CgogICAgICAgZm9yKGk9MDtpPGM7aSsrKQogICAgICAgewogICAgICAgIGNpbj4+YjsKICAgICAgICBpZihiPT0wKQogICAgICAgIHsKICAgICAgICAgICAgY2luPj5wPj5xPj52OwogICAgICAgICAgIHVwZGF0ZXRyZWUoMCxuLTEsdixwLHEsMCk7Ly8gY29uc3RhbnQgdmFsdWUgc2hvdWxkIGJlIGZyb20gcmlnaHQgc2lkZQogICAgICAgIH0KICAgICAgIC8qIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIGNpbj4+cD4+cTsKICAgICAgICAgICAgYWRkdHJlZShwLHEpOwogICAgICAgIH0qLwogICAgICAgfQogICAgIH0KICAgIHJldHVybiAwOwogICAgfQoKICAgdm9pZCB1cGRhdGV0cmVlKGludCBsb3csaW50IGhpZ2gsaW50IHZhbHVlLGludCBxbG93LGludCBxaGlnaCxpbnQgcG9zKQogICAgewogICAgIGlmKGxhenlbcG9zXSE9MCkKICAgICAgewogICAgICAgIHNlZ3RyZWVbcG9zXSs9bGF6eVtwb3NdOwogICAgICAgIGlmKGxvdyE9aGlnaCkKICAgICAgICAgIHsKCiAgICAgICAgICBsYXp5WzIqcG9zKzFdKz1sYXp5W3Bvc107CiAgICAgICAgICBsYXp5WzIqcG9zKzJdKz1sYXp5W3Bvc107CiAgICAgICAgICB9CiAgICAgICAgICBsYXp5W3Bvc109MDsKICAgICB9CiAgICAgaWYobG93PnFoaWdofHxoaWdoPHFsb3cpIHJldHVybjsvLyBsYXRlciBhZGRpdGlvbgogICAgIGlmKHFsb3c8PWxvdyYmcWhpZ2g+PWhpZ2gpCiAgICAgICB7CiAgICAgICAgc2VndHJlZVtwb3NdKz12YWx1ZTsKICAgICAgICBpZihsb3chPWhpZ2gpCiAgICAgICAgewogICAgICAgICAgICBsYXp5WzIqcG9zKzFdKz12YWx1ZTsKICAgICAgICAgICAgbGF6eVsyKnBvcysyXSs9dmFsdWU7CiAgICAgICAgfQogICAgICByZXR1cm4gOwogICAgIH0KICAgICAvL2lmIHBhcnRpYWwgb3ZlcmxhcHMKICAgICBpbnQgbWlkOwogICAgIG1pZD0obG93K2hpZ2gpLzI7CiAgICAgdXBkYXRldHJlZShsb3csbWlkLHZhbHVlLHFsb3cscWhpZ2gsMipwb3MrMSk7CiAgICAgdXBkYXRldHJlZShtaWQrMSxoaWdoLHZhbHVlLHFsb3cscWhpZ2gsMitwb3MrMik7CiAgICAgc2VndHJlZVtwb3NdPW1pbihzZWd0cmVlWzIqcG9zKzFdLHNlZ3RyZWVbMipwb3MrMl0pOwogICAgfQo=