#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll n;
struct node {
ll l1,r1,l2,r2;
} d[200001],d2[200001];
bool cmp(node a,node b) {
return a.l2<=b.l2;
}
bool cmp2(ll a,ll b) {
return a<=b;
}
struct node2 {
ll lnum,rnum;
};
ll _l[200001],_r[200001];
node2 cutted[440000];
ll cnt=0;
ll summin,summax;
bool cmpr(node a,node b) {
return a.r2<=b.r2;
}
ll s1_1[200001],s1_2[200001],s2_1[200001],s2_2[200001];
ll find1(ll x) {
ll l=1,r=n,mid;
while(l<r) {
mid=(l+r)>>1;
if(mid==l) {
if(d2[mid].r2<x) {
return mid;
}
}
if(d2[mid].r2<x) {
l=mid;
} else {
r=mid-1;
}
}
return r;
}
ll find2(ll x) {
ll l=1,r=n,mid;
while(l<r) {
mid=(l+r)>>1;
if(d[mid].l2<=x) {
l=mid+1;
} else {
r=mid;
}
}
return l;
}
ll __abs(ll a) {
if(a>=0)return a;
return -a;
}
int main() {
freopen("lucky.in","r",stdin);
freopen("lucky.out","w",stdout);
ll c,T;
cin >>c>>T;
while(T--) {
ll ans=0;
summin=0,summax=0;
cin>>n;
for(ll i=1; i<=n; i++) {
cin>>d[i].l1>>d[i].r1>>d[i].l2>>d[i].r2;
d2[i].l1=d[i].l1,d2[i].l2=d[i].l2,d2[i].r1=d[i].r1,d2[i].r2=d[i].r2;
summin+=d[i].l1;
summax+=d[i].r1;
_l[i]=d[i].l2,_r[i]=d[i].r2;
}
sort(d+1,d+n+1,cmp);
sort(d2+1,d2+n+1,cmpr);
for(ll i=1; i<=n; i++) {
s1_1[i]=s1_1[i-1]+d[i].l1;
s1_2[i]=s1_2[i-1]+d[i].r1;
s2_1[i]=s2_1[i-1]+d2[i].l1;
s2_2[i]=s2_2[i-1]+d2[i].r1;
}
sort(_l+1,_l+n+1,cmp2);
sort(_r+1,_r+n+1,cmp2);
ll lop=1,rop=1;
cnt=0;
while(rop <=n or lop<=n) {
while(_r[rop]<_l[lop]) {
if(_r[rop] < _l[lop]-1) {
if(cutted[cnt].rnum+1 <=_r[rop]) {
++cnt;
cutted[cnt].lnum=cutted[cnt-1].rnum+1;
cutted[cnt].rnum=_r[rop];
}
rop++;
}else if(_r[rop] == _l[lop]-1){
if(cutted[cnt].rnum+1 <=_r[rop]) {
++cnt;
cutted[cnt].lnum=cutted[cnt-1].rnum+1;
cutted[cnt].rnum=_r[rop];
}
rop++;
lop++;
}else{
if(cutted[cnt].rnum+1 <=_l[lop]-1) {
++cnt;
cutted[cnt].lnum=cutted[cnt-1].rnum+1;
cutted[cnt].rnum=_l[lop]-1;
}
lop++;
}
continue;
}
ll segFirst=_l[lop];
while(_l[lop]==segFirst and lop<=n)lop++;
if(lop>n) {
cutted[++cnt].lnum=_l[n];
cutted[cnt].rnum=_r[rop];
while(_r[rop]==_r[rop+1])rop++;
rop++;
break;
}
if(_r[rop]<=_l[lop]-1) {
cutted[++cnt].lnum=segFirst;
cutted[cnt].rnum=_r[rop];
while(_r[rop]==_r[rop+1])rop++;
rop++;
continue;
} else if(_r[rop]==_l[lop-1]) {
cutted[++cnt].lnum=segFirst;
cutted[cnt].rnum=_r[rop];
while(_r[rop]==_r[rop+1])rop++;
rop++,lop++;
continue;
} else {
cutted[++cnt].lnum=segFirst;
cutted[cnt].rnum=_l[lop]-1;
continue;
}
}
while(rop<=n) {
if(cutted[cnt].rnum+1 <=_r[rop]) {
++cnt;
cutted[cnt].lnum=cutted[cnt-1].rnum+1;
cutted[cnt].rnum=_r[rop];
}
rop++;
}
ans=0;
for(ll i=1; i<=cnt; i++) {
ll nl=cutted[i].lnum,nr=cutted[i].rnum;
ll left=find1(nl);
ll lmin=s2_1[left];
ll lmax=s2_2[left];
ll right=find2(nr);
ll rmin,rmax;
if(left<1 or d2[left].r2>=nl) {
lmin=0,lmax=0;
}
if(right>n or d[right].l2<=nr) {
rmin=0,rmax=0;
} else {
rmin=s1_1[n]-s1_1[right-1];
rmax=s1_2[n]-s1_2[right-1];
}
ll midmax=summax-rmax-lmax;
if((rmin >=lmin and rmin<=lmax ) or (rmax>=lmin and rmax<=lmax) or (lmin >=rmin and lmin <= rmax) or (lmax >=rmin and lmax<=rmax)) {
ans+=(nr-nl+1);
continue;
}
ll leastneed=min(__abs(rmin-lmax),__abs(lmin-rmax));
if(lmin>rmax) {
leastneed+=1;
}
if(leastneed<=midmax) {
ans+=(nr-nl+1);
continue;
}
}
cout<<ans<<endl;
}
return 0;
}