rt.

#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10;
struct NODE {
int l, r;
int min_v, tot, add;
} tr[N * 4];
void pushup(NODE &u, NODE &l, NODE &r) {
u.min_v = min(l.min_v, r.min_v);
if (l.min_v < r.min_v) {
u.tot = l.tot;
} else if (l.min_v > r.min_v) {
u.tot = r.tot;
} else {
u.tot = l.tot + r.tot;
}
}
void pushup(int u) { pushup(tr[u], tr[u * 2], tr[u * 2 + 1]); }
void build(int u, int l, int r) {
if (l == r) {
tr[u] = {l, r, 0, 1, 0};
} else {
tr[u] = {l, r, 0, 1, 0};
int mid = (l + r) / 2;
build(u * 2, l, mid);
build(u * 2 + 1, mid + 1, r);
pushup(u);
}
}
void pushdown(int x) {
NODE &u = tr[x], &l = tr[x * 2], &r = tr[x * 2 + 1];
if (u.add) {
l.add += u.add;
r.add += u.add;
l.min_v += u.add;
r.min_v += u.add;
u.add = 0;
}
}
NODE query(int u, int l, int r) {
if (tr[u].l >= l && tr[u].r <= r) {
return tr[u];
} else {
pushdown(u);
int mid = (tr[u].l + tr[u].r) / 2;
if (mid >= r) {
return query(u * 2, l, r);
} else if (mid < r) {
return query(u * 2 + 1, l, r);
} else {
NODE res1 = query(u * 2, l, r);
NODE res2 = query(u * 2 + 1, l, r);
NODE ans;
pushup(ans, res1, res2);
return ans;
}
}
}
void modify(int u, int l, int r, int d) {
if (tr[u].l >= l && tr[u].r <= r) {
tr[u].min_v += d;
tr[u].add += d;
} else {
pushdown(u);
int mid = (tr[u].l + tr[u].r) / 2;
if (mid >= l) {
modify(u * 2, l, r, d);
}
if (mid < r) {
modify(u * 2 + 1, l, r, d);
}
pushup(u);
}
}
struct node {
int L, R, d;
};
vector<node> vec[N];
int main() {
ios::sync_with_stdio(false), cin.tie(0);
int n;
cin >> n;
for (int i = 1; i <= n; i++) {
int X1, Y1, X2, Y2;
cin >> X1 >> Y1 >> X2 >> Y2;
vec[X1].push_back({Y1, Y2, 1});
vec[X2 + 1].push_back({Y1, Y2, -1});
}
build(1, 1, 10);
int ans = 0;
for (int i = 1; i <= 6; i++) {
for (auto x : vec[i]) {
modify(1, x.L, x.R, x.d);
}
ans += query(1, 1, N - 1).tot;
}
cout << ans << "\n";
return 0;
}