#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define ull unsigned long long
#define db double
#define pb push_back
#define mem(a,x) memset((a),(x),sizeof(a))
#define fi first
#define se second
#define vt vector
#define pii pair<int,int>
#define pll pair<ll,ll>
#define F(i,a,b) for(int i = (a);i <= (b);i++)
#define D(i,a,b) for(int i = (a);i >= (b);i--)
const int N = 4e5+10;
const ll inf = 1e18,mod = 998244353;
ll read(){
ll x = 0,f = 1;char c = getchar();
for(;c < '0' || c > '9';c = getchar())if(c == '-')f = -1;
for(;c >= '0' && c <= '9';c = getchar())x = (x << 1) + (x << 3) + c-'0';
return x * f;
}
int n;
struct node{
ll L,R,l,r;
}a[N];
ll c[N],cnt = 0,m;
struct made{
ll l,r;
made operator + (const made x)const{return {l + x.l,r + x.r};};
}sf[N],pr[N];
vt<node>G[N],q[N];
int rt;
struct segment{
ll s[N*40],idx = 0;
int ls[N*40],rs[N*40];
#define mid (l + r >> 1)
void clear(){
F(i,1,idx)s[i] = ls[i] = rs[i] = 0;
idx = 0;
}
void add(int &p,ll l,ll r,ll L,ll R,ll k){
if(!p)p = ++idx;
if(L <= l && r <= R)return s[p] += k,void();
if(L <= mid)add(ls[p],l,mid,L,R,k);
if(R > mid)add(rs[p],mid+1,r,L,R,k);
}
ll ask(int &p,ll l,ll r,ll x){
if(!p)return 0;
if(x <= mid)return ask(ls[p],l,mid,x) + s[p];
else return ask(rs[p],mid+1,r,x) + s[p];
}
#undef mid
}t;
bool check(ll x){
ll s = t.ask(rt,1,m,x);
int p = upper_bound(c + 1,c + 1 + cnt,x) - c;
made sl = pr[p - 1],sr = sf[p];
if(sl.l <= sr.r && sr.l <= sl.r){
if(s)return 1;
}
else if(sl.r < sr.l){
if(sr.l - sl.r <= s)return 1;
}
else if(sr.r < sl.l){
if(sl.l - sr.r < s)return 1;
}
return 0;
}
void solve(){
n = read();
cnt = m = 0;
F(i,1,n)a[i].L = read(),a[i].R = read(),a[i].l = read(),a[i].r = read(),m = max(m,a[i].r);
rt = 0;
t.clear();
F(i,1,n)t.add(rt,1,m,a[i].l,a[i].r,a[i].R);
F(i,1,n)c[++cnt] = a[i].l,c[++cnt] = a[i].r + 1;
c[++cnt] = inf;
sort(c + 1,c + 1 + cnt);
cnt = unique(c + 1,c + 1 + cnt) - (c + 1);
F(i,1,n)a[i].l = lower_bound(c + 1,c + 1 + cnt,a[i].l) - c,a[i].r = lower_bound(c + 1,c + 1 + cnt,a[i].r + 1) - c;
F(i,1,cnt)G[i].clear();
F(i,1,n)G[a[i].l].pb(a[i]);
sf[cnt + 1] = {0,0};
D(i,cnt,1){
sf[i] = sf[i + 1];
for(auto it : G[i])sf[i] = sf[i] + made{it.L,it.R};
}
F(i,1,cnt)q[i].clear();
F(i,1,n){
q[a[i].r].pb(a[i]);
}
pr[0] = {0,0};
F(i,1,cnt){
pr[i] = pr[i - 1];
for(auto it : q[i])pr[i] = pr[i] + made{it.L,it.R};
}
ll ans = 0;
F(i,1,cnt - 2){
ll l = c[i],r = c[i + 1] - 1;
if(l > r)continue;
if(check(l) && check(r))ans += r - l + 1;
}
printf("%lld\n",ans);
}
int main(){
freopen("lucky.in","r",stdin);
freopen("lucky.out","w",stdout);
int c = read(),t = read();
F(i,1,t)solve();
return 0;
}