#include <cstdio>
#include <algorithm>
using namespace std;
typedef long long ll;
const int MAX_N = 1e6 + 10;
struct ScanLine {
ll x1, x2, y;
int delta; // +1表示矩形开始边,-1表示结束边
bool operator<(const ScanLine& other) const {
return y < other.y;
}
};
struct SegmentNode {
int left, right;
int cover; // 当前区间被覆盖的次数
ll length; // 当前区间被覆盖的总长度
};
int n;
ll x_coords[MAX_N * 2];
ScanLine lines[MAX_N * 2];
SegmentNode seg_tree[MAX_N * 4];
#define LEFT_CHILD(x) ((x) << 1)
#define RIGHT_CHILD(x) ((x) << 1 | 1)
void build_segment_tree(int node, int left, int right) {
seg_tree[node].left = left;
seg_tree[node].right = right;
seg_tree[node].cover = 0;
seg_tree[node].length = 0;
if (left == right) return;
int mid = (left + right) / 2;
build_segment_tree(LEFT_CHILD(node), left, mid);
build_segment_tree(RIGHT_CHILD(node), mid + 1, right);
}
void update_node(int node) {
if (seg_tree[node].cover > 0) {
seg_tree[node].length = x_coords[seg_tree[node].right + 1] - x_coords[seg_tree[node].left];
} else {
if (seg_tree[node].left == seg_tree[node].right) {
seg_tree[node].length = 0;
} else {
seg_tree[node].length = seg_tree[LEFT_CHILD(node)].length +
seg_tree[RIGHT_CHILD(node)].length;
}
}
}
void update_segment_tree(int node, ll update_x1, ll update_x2, int delta) {
// 当前节点区间完全不在更新范围内
if (x_coords[seg_tree[node].right + 1] <= update_x1 ||
update_x2 <= x_coords[seg_tree[node].left]) {
return;
}
// 当前节点区间完全在更新范围内
if (update_x1 <= x_coords[seg_tree[node].left] &&
x_coords[seg_tree[node].right + 1] <= update_x2) {
seg_tree[node].cover += delta;
update_node(node);
return;
}
// 部分重叠,递归更新子节点
update_segment_tree(LEFT_CHILD(node), update_x1, update_x2, delta);
update_segment_tree(RIGHT_CHILD(node), update_x1, update_x2, delta);
update_node(node);
}
int main() {
scanf("%d", &n);
// 读取矩形数据并生成扫描线
for (int i = 0; i < n; ++i) {
ll x1, y1, x2, y2;
scanf("%lld%lld%lld%lld", &x1, &y1, &x2, &y2);
// 确保x1 < x2, y1 < y2
if (x1 > x2) swap(x1, x2);
if (y1 > y2) swap(y1, y2);
x_coords[i * 2] = x1;
x_coords[i * 2 + 1] = x2;
lines[i * 2] = {x1, x2, y1, 1}; // 矩形开始边
lines[i * 2 + 1] = {x1, x2, y2, -1}; // 矩形结束边
}
int num_lines = n * 2;
// 离散化x坐标
sort(x_coords, x_coords + num_lines);
int unique_x = unique(x_coords, x_coords + num_lines) - x_coords;
// 构建线段树
build_segment_tree(1, 0, unique_x - 2);
// 处理扫描线
sort(lines, lines + num_lines);
ll total_area = 0;
for (int i = 0; i < num_lines - 1; ++i) {
update_segment_tree(1, lines[i].x1, lines[i].x2, lines[i].delta);
total_area += seg_tree[1].length * (lines[i + 1].y - lines[i].y);
}
printf("%lld\n", total_area);
return 0;
}
I2luY2x1ZGUgPGNzdGRpbz4KI2luY2x1ZGUgPGFsZ29yaXRobT4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKdHlwZWRlZiBsb25nIGxvbmcgbGw7Cgpjb25zdCBpbnQgTUFYX04gPSAxZTYgKyAxMDsKCnN0cnVjdCBTY2FuTGluZSB7CiAgICBsbCB4MSwgeDIsIHk7CiAgICBpbnQgZGVsdGE7IC8vICsx6KGo56S655+p5b2i5byA5aeL6L6577yMLTHooajnpLrnu5PmnZ/ovrkKICAgIAogICAgYm9vbCBvcGVyYXRvcjwoY29uc3QgU2NhbkxpbmUmIG90aGVyKSBjb25zdCB7CiAgICAgICAgcmV0dXJuIHkgPCBvdGhlci55OwogICAgfQp9OwoKc3RydWN0IFNlZ21lbnROb2RlIHsKICAgIGludCBsZWZ0LCByaWdodDsKICAgIGludCBjb3ZlcjsgLy8g5b2T5YmN5Yy66Ze06KKr6KaG55uW55qE5qyh5pWwCiAgICBsbCBsZW5ndGg7IC8vIOW9k+WJjeWMuumXtOiiq+imhueblueahOaAu+mVv+W6pgp9OwoKaW50IG47CmxsIHhfY29vcmRzW01BWF9OICogMl07ClNjYW5MaW5lIGxpbmVzW01BWF9OICogMl07ClNlZ21lbnROb2RlIHNlZ190cmVlW01BWF9OICogNF07CgojZGVmaW5lIExFRlRfQ0hJTEQoeCkgICgoeCkgPDwgMSkKI2RlZmluZSBSSUdIVF9DSElMRCh4KSAoKHgpIDw8IDEgfCAxKQoKdm9pZCBidWlsZF9zZWdtZW50X3RyZWUoaW50IG5vZGUsIGludCBsZWZ0LCBpbnQgcmlnaHQpIHsKICAgIHNlZ190cmVlW25vZGVdLmxlZnQgPSBsZWZ0OwogICAgc2VnX3RyZWVbbm9kZV0ucmlnaHQgPSByaWdodDsKICAgIHNlZ190cmVlW25vZGVdLmNvdmVyID0gMDsKICAgIHNlZ190cmVlW25vZGVdLmxlbmd0aCA9IDA7CiAgICAKICAgIGlmIChsZWZ0ID09IHJpZ2h0KSByZXR1cm47CiAgICAKICAgIGludCBtaWQgPSAobGVmdCArIHJpZ2h0KSAvIDI7CiAgICBidWlsZF9zZWdtZW50X3RyZWUoTEVGVF9DSElMRChub2RlKSwgbGVmdCwgbWlkKTsKICAgIGJ1aWxkX3NlZ21lbnRfdHJlZShSSUdIVF9DSElMRChub2RlKSwgbWlkICsgMSwgcmlnaHQpOwp9Cgp2b2lkIHVwZGF0ZV9ub2RlKGludCBub2RlKSB7CiAgICBpZiAoc2VnX3RyZWVbbm9kZV0uY292ZXIgPiAwKSB7CiAgICAgICAgc2VnX3RyZWVbbm9kZV0ubGVuZ3RoID0geF9jb29yZHNbc2VnX3RyZWVbbm9kZV0ucmlnaHQgKyAxXSAtIHhfY29vcmRzW3NlZ190cmVlW25vZGVdLmxlZnRdOwogICAgfSBlbHNlIHsKICAgICAgICBpZiAoc2VnX3RyZWVbbm9kZV0ubGVmdCA9PSBzZWdfdHJlZVtub2RlXS5yaWdodCkgewogICAgICAgICAgICBzZWdfdHJlZVtub2RlXS5sZW5ndGggPSAwOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHNlZ190cmVlW25vZGVdLmxlbmd0aCA9IHNlZ190cmVlW0xFRlRfQ0hJTEQobm9kZSldLmxlbmd0aCArIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlZ190cmVlW1JJR0hUX0NISUxEKG5vZGUpXS5sZW5ndGg7CiAgICAgICAgfQogICAgfQp9Cgp2b2lkIHVwZGF0ZV9zZWdtZW50X3RyZWUoaW50IG5vZGUsIGxsIHVwZGF0ZV94MSwgbGwgdXBkYXRlX3gyLCBpbnQgZGVsdGEpIHsKICAgIC8vIOW9k+WJjeiKgueCueWMuumXtOWujOWFqOS4jeWcqOabtOaWsOiMg+WbtOWGhQogICAgaWYgKHhfY29vcmRzW3NlZ190cmVlW25vZGVdLnJpZ2h0ICsgMV0gPD0gdXBkYXRlX3gxIHx8IAogICAgICAgIHVwZGF0ZV94MiA8PSB4X2Nvb3Jkc1tzZWdfdHJlZVtub2RlXS5sZWZ0XSkgewogICAgICAgIHJldHVybjsKICAgIH0KICAgIAogICAgLy8g5b2T5YmN6IqC54K55Yy66Ze05a6M5YWo5Zyo5pu05paw6IyD5Zu05YaFCiAgICBpZiAodXBkYXRlX3gxIDw9IHhfY29vcmRzW3NlZ190cmVlW25vZGVdLmxlZnRdICYmIAogICAgICAgIHhfY29vcmRzW3NlZ190cmVlW25vZGVdLnJpZ2h0ICsgMV0gPD0gdXBkYXRlX3gyKSB7CiAgICAgICAgc2VnX3RyZWVbbm9kZV0uY292ZXIgKz0gZGVsdGE7CiAgICAgICAgdXBkYXRlX25vZGUobm9kZSk7CiAgICAgICAgcmV0dXJuOwogICAgfQogICAgCiAgICAvLyDpg6jliIbph43lj6DvvIzpgJLlvZLmm7TmlrDlrZDoioLngrkKICAgIHVwZGF0ZV9zZWdtZW50X3RyZWUoTEVGVF9DSElMRChub2RlKSwgdXBkYXRlX3gxLCB1cGRhdGVfeDIsIGRlbHRhKTsKICAgIHVwZGF0ZV9zZWdtZW50X3RyZWUoUklHSFRfQ0hJTEQobm9kZSksIHVwZGF0ZV94MSwgdXBkYXRlX3gyLCBkZWx0YSk7CiAgICB1cGRhdGVfbm9kZShub2RlKTsKfQoKaW50IG1haW4oKSB7CiAgICBzY2FuZigiJWQiLCAmbik7CiAgICAKICAgIC8vIOivu+WPluefqeW9ouaVsOaNruW5tueUn+aIkOaJq+aPj+e6vwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuOyArK2kpIHsKICAgICAgICBsbCB4MSwgeTEsIHgyLCB5MjsKICAgICAgICBzY2FuZigiJWxsZCVsbGQlbGxkJWxsZCIsICZ4MSwgJnkxLCAmeDIsICZ5Mik7CiAgICAgICAgCiAgICAgICAgLy8g56Gu5L+deDEgPCB4MiwgeTEgPCB5MgogICAgICAgIGlmICh4MSA+IHgyKSBzd2FwKHgxLCB4Mik7CiAgICAgICAgaWYgKHkxID4geTIpIHN3YXAoeTEsIHkyKTsKICAgICAgICAKICAgICAgICB4X2Nvb3Jkc1tpICogMl0gPSB4MTsKICAgICAgICB4X2Nvb3Jkc1tpICogMiArIDFdID0geDI7CiAgICAgICAgCiAgICAgICAgbGluZXNbaSAqIDJdID0ge3gxLCB4MiwgeTEsIDF9OyAgIC8vIOefqeW9ouW8gOWni+i+uQogICAgICAgIGxpbmVzW2kgKiAyICsgMV0gPSB7eDEsIHgyLCB5MiwgLTF9OyAvLyDnn6nlvaLnu5PmnZ/ovrkKICAgIH0KICAgIAogICAgaW50IG51bV9saW5lcyA9IG4gKiAyOwogICAgCiAgICAvLyDnprvmlaPljJZ45Z2Q5qCHCiAgICBzb3J0KHhfY29vcmRzLCB4X2Nvb3JkcyArIG51bV9saW5lcyk7CiAgICBpbnQgdW5pcXVlX3ggPSB1bmlxdWUoeF9jb29yZHMsIHhfY29vcmRzICsgbnVtX2xpbmVzKSAtIHhfY29vcmRzOwogICAgCiAgICAvLyDmnoTlu7rnur/mrrXmoJEKICAgIGJ1aWxkX3NlZ21lbnRfdHJlZSgxLCAwLCB1bmlxdWVfeCAtIDIpOwogICAgCiAgICAvLyDlpITnkIbmiavmj4/nur8KICAgIHNvcnQobGluZXMsIGxpbmVzICsgbnVtX2xpbmVzKTsKICAgIAogICAgbGwgdG90YWxfYXJlYSA9IDA7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bV9saW5lcyAtIDE7ICsraSkgewogICAgICAgIHVwZGF0ZV9zZWdtZW50X3RyZWUoMSwgbGluZXNbaV0ueDEsIGxpbmVzW2ldLngyLCBsaW5lc1tpXS5kZWx0YSk7CiAgICAgICAgdG90YWxfYXJlYSArPSBzZWdfdHJlZVsxXS5sZW5ndGggKiAobGluZXNbaSArIDFdLnkgLSBsaW5lc1tpXS55KTsKICAgIH0KICAgIAogICAgcHJpbnRmKCIlbGxkXG4iLCB0b3RhbF9hcmVhKTsKICAgIHJldHVybiAwOwp9