#include <bits/stdc++.h>
#define up(i,a,b) for (int i = (int)a; i <= (int)b; i++)
using namespace std;
const int maxn = 1e5 + 10;
const int MOD = 1e9 + 7;
struct EVENT{
int x;
int y1;
int y2;
int type;
};
//Các sự kiện sweepline gồm tọa độ x, độ dài y1, y2, và kiểu sự kiện
//đóng hay mở một đoạn thẳng
bool comp(EVENT& A, EVENT& B){
if (A.x == B.x) return A.type > B.type;
return A.x < B.x;
}
//Xử lý các sự kiện x trước
vector<EVENT> events;
vector<int> tempY;
int n, treesize;
long long T1[maxn << 3];
long long T2[maxn << 3];
long long T3[maxn << 3];
int delta[maxn << 3];
//maxn << 1 cho số lượng sự kiện tối đa có thể xảy ra (1 mở và 1 đóng)
//maxn << 3 cho ước lượng segment tree trên toàn sự kiện
void push_up(int nod, int l, int r){
int len = tempY[r+1] - tempY[l];
if (delta[nod] >= 3) {
// đoạn này bị phủ >=3 lần => toàn bộ là T3
T3[nod] = T2[nod] = T1[nod] = len;
return;
}
if (l == r){
// leaf
if (delta[nod] == 2) T1[nod] = T2[nod] = len, T3[nod] = 0;
else if (delta[nod] == 1) T1[nod] = len, T2[nod] = T3[nod] = 0;
else T1[nod] = T2[nod] = T3[nod] = 0;
return;
}
if (delta[nod] == 2){
// whole interval has +2; so >=1 and >=2 are full length
T1[nod] = T2[nod] = len;
// parts that become >=3 are where children had >=1
T3[nod] = T1[nod*2] + T1[nod*2+1];
return;
}
if (delta[nod] == 1){
// whole interval has +1 => >=1 is full length
T1[nod] = len;
// >=2 are positions where child had >=1
T2[nod] = T1[nod*2] + T1[nod*2+1];
// >=3 are positions where child had >=2
T3[nod] = T2[nod*2] + T2[nod*2+1];
return;
}
// delta == 0
T1[nod] = T1[nod*2] + T1[nod*2+1];
T2[nod] = T2[nod*2] + T2[nod*2+1];
T3[nod] = T3[nod*2] + T3[nod*2+1];
}
//Nếu "khoảng" [l, r] bị bao hoàn toàn thì lấy toàn bộ
//Nếu "khoảng" [l, r] chỉ bị bao một phần và không phải nút lá thì cập nhật dựa theo con
//Nếu "khoảng" lá không bị bao thì phải bằng 0
//Chú ý: nếu không có điều kiện (l != r) thì segment tree có thể lấy T[nod*2] với nod*2 là chỉ số tràn ngoài phạm vi đã khai báo
void update(int nod, int l, int r, int u, int v, int val){
if (r < u || l > v) return;
if (l >= u && r <= v){
delta[nod] += val;
push_up(nod, l, r);
return;
}
int mid = (l+r) >> 1;
update(nod*2, l, mid, u, v, val);
update(nod*2+1, mid+1, r, u, v, val);
push_up(nod, l, r);
}
signed main(){
ios_base::sync_with_stdio(false);
cin.tie(0);
#define Task "A"
if (fopen(Task".inp", "r")){
freopen(Task".inp", "r", stdin);
freopen(Task".out", "w", stdout);
}
cin >> n;
up(i,1,n){
int x1, y1, x2, y2;
cin >> x1 >> y1 >> x2 >> y2;
tempY.push_back(y1);
tempY.push_back(y2);
events.push_back({x1, y1, y2, 1});
events.push_back({x2, y1, y2, -1});
}
tempY.push_back(-MOD);
sort(tempY.begin(), tempY.end());
tempY.resize(unique(tempY.begin(), tempY.end()) - tempY.begin());
treesize = tempY.size()-1;
// tempY thêm phần tử -MOD để lấy lowerbound với chỉ số bắt đầu từ 1
// treesize = tempY.size()-1 vì phải bỏ qua phần tử -MOD;
sort(events.begin(), events.end(), comp);
long long res = 0;
for (int i = 0; i < (int)(events.size()-1); i++){
int u = lower_bound(tempY.begin(), tempY.end(), events[i].y1) - tempY.begin();
int v = lower_bound(tempY.begin(), tempY.end(), events[i].y2) - tempY.begin();
update(1, 1, treesize-1, u, v-1, events[i].type);
res += 1ll * (T2[1] - T3[1]) * (events[i+1].x - events[i].x);
// Segment tree quản lý các "khoảng" giữa tọa độ điểm này và tọa độ điểm kia
// có treesize tọa độ điểm thì có treesize-1 "khoảng"
// Tại mỗi nút chỉ số v quản lý khoảng [l, r], lấy kết quả nút nếu bị bao toàn bộ là tempY[r+1] - tempY[l]
// Do đó, mỗi lần lấy kết quả trong tọa độ [u, v] thì lấy kết quả trên "khoảng" [u, v-1] trên segment tree
// cout << T1[1] << " " << T2[1] << " " << T3[1] << " " << res << " ";
// cout << u << " " << v << "\n";
}
cout << res;
}
/**Code Trâu**/
//#include <bits/stdc++.h>
//#define up(i,a,b) for (int i = (int)a; i <= (int)b; i++)
//#define down(i,a,b) for (int i = (int)a; i >= (int)b; i--)
//using namespace std;
//
//const int maxn = 5e2 + 10;
//int n;
//int a[maxn][maxn];
//int MAXX = 500;
//int MAXY = 500;
//
//signed main(){//code trau
// ios_base::sync_with_stdio(false);
// cin.tie(0);
// #define Task "A"
// if (fopen(Task".inp", "r")){
// freopen(Task".inp", "r", stdin);
// freopen(Task".out", "w", stdout);
// }
//
// int maxx, maxy;
// maxx = -MAXX;
// maxy = -MAXX;
// cin >> n;
// up(i,1,n){
// int x1, y1, x2, y2;
// cin >> x1 >> y1 >> x2 >> y2;
// maxx = max(maxx, x2-1);
// maxy = max(maxy, y2-1);
// up(i, x1, x2-1){
// up(j, y1, y2-1){
// ++a[i][j];
// }
// }
// }
//
// int cnt = 0;
// up(i,1,maxx){
// up(j,1,maxy){
// if (a[i][j] == 2) ++cnt;
// }
// }
// cout << cnt << "\n";
//
//
// down(j,maxy,1){
// up(i,1,maxx){
// cout << a[i][j] << " ";
// }
// cout << "\n";
// }
//}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CiNkZWZpbmUgdXAoaSxhLGIpIGZvciAoaW50IGkgPSAoaW50KWE7IGkgPD0gKGludCliOyBpKyspCnVzaW5nIG5hbWVzcGFjZSBzdGQ7Cgpjb25zdCBpbnQgbWF4biA9IDFlNSArIDEwOwpjb25zdCBpbnQgTU9EID0gMWU5ICsgNzsKc3RydWN0IEVWRU5UewogICAgaW50IHg7CiAgICBpbnQgeTE7CiAgICBpbnQgeTI7CiAgICBpbnQgdHlwZTsKfTsKLy9Dw6FjIHPhu7Ega2nhu4duIHN3ZWVwbGluZSBn4buTbSB04buNYSDEkeG7mSB4LCDEkeG7mSBkw6BpIHkxLCB5MiwgdsOgIGtp4buDdSBz4buxIGtp4buHbgovL8SRw7NuZyBoYXkgbeG7nyBt4buZdCDEkW/huqFuIHRo4bqzbmcKCmJvb2wgY29tcChFVkVOVCYgQSwgRVZFTlQmIEIpewogICAgaWYgKEEueCA9PSBCLngpIHJldHVybiBBLnR5cGUgPiBCLnR5cGU7CiAgICByZXR1cm4gQS54IDwgQi54Owp9Ci8vWOG7rSBsw70gY8OhYyBz4buxIGtp4buHbiB4IHRyxrDhu5tjCgp2ZWN0b3I8RVZFTlQ+IGV2ZW50czsKdmVjdG9yPGludD4gdGVtcFk7CgppbnQgbiwgdHJlZXNpemU7CmxvbmcgbG9uZyBUMVttYXhuIDw8IDNdOwpsb25nIGxvbmcgVDJbbWF4biA8PCAzXTsKbG9uZyBsb25nIFQzW21heG4gPDwgM107CmludCBkZWx0YVttYXhuIDw8IDNdOwovL21heG4gPDwgMSBjaG8gc+G7kSBsxrDhu6NuZyBz4buxIGtp4buHbiB04buRaSDEkWEgY8OzIHRo4buDIHjhuqN5IHJhICgxIG3hu58gdsOgIDEgxJHDs25nKQovL21heG4gPDwgMyBjaG8gxrDhu5tjIGzGsOG7o25nIHNlZ21lbnQgdHJlZSB0csOqbiB0b8OgbiBz4buxIGtp4buHbgoKdm9pZCBwdXNoX3VwKGludCBub2QsIGludCBsLCBpbnQgcil7CiAgICBpbnQgbGVuID0gdGVtcFlbcisxXSAtIHRlbXBZW2xdOwogICAgaWYgKGRlbHRhW25vZF0gPj0gMykgewovLyAgICAgIMSRb+G6oW4gbsOgeSBi4buLIHBo4bunID49MyBs4bqnbiA9PiB0b8OgbiBi4buZIGzDoCBUMwogICAgICAgIFQzW25vZF0gPSBUMltub2RdID0gVDFbbm9kXSA9IGxlbjsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgaWYgKGwgPT0gcil7CiAgICAgICAgLy8gbGVhZgogICAgICAgIGlmIChkZWx0YVtub2RdID09IDIpICAgICAgVDFbbm9kXSA9IFQyW25vZF0gPSBsZW4sIFQzW25vZF0gPSAwOwogICAgICAgIGVsc2UgaWYgKGRlbHRhW25vZF0gPT0gMSkgVDFbbm9kXSA9IGxlbiwgVDJbbm9kXSA9IFQzW25vZF0gPSAwOwogICAgICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgVDFbbm9kXSA9IFQyW25vZF0gPSBUM1tub2RdID0gMDsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgaWYgKGRlbHRhW25vZF0gPT0gMil7CiAgICAgICAgLy8gd2hvbGUgaW50ZXJ2YWwgaGFzICsyOyBzbyA+PTEgYW5kID49MiBhcmUgZnVsbCBsZW5ndGgKICAgICAgICBUMVtub2RdID0gVDJbbm9kXSA9IGxlbjsKICAgICAgICAvLyBwYXJ0cyB0aGF0IGJlY29tZSA+PTMgYXJlIHdoZXJlIGNoaWxkcmVuIGhhZCA+PTEKICAgICAgICBUM1tub2RdID0gVDFbbm9kKjJdICsgVDFbbm9kKjIrMV07CiAgICAgICAgcmV0dXJuOwogICAgfQogICAgaWYgKGRlbHRhW25vZF0gPT0gMSl7CiAgICAgICAgLy8gd2hvbGUgaW50ZXJ2YWwgaGFzICsxID0+ID49MSBpcyBmdWxsIGxlbmd0aAogICAgICAgIFQxW25vZF0gPSBsZW47CiAgICAgICAgLy8gPj0yIGFyZSBwb3NpdGlvbnMgd2hlcmUgY2hpbGQgaGFkID49MQogICAgICAgIFQyW25vZF0gPSBUMVtub2QqMl0gKyBUMVtub2QqMisxXTsKICAgICAgICAvLyA+PTMgYXJlIHBvc2l0aW9ucyB3aGVyZSBjaGlsZCBoYWQgPj0yCiAgICAgICAgVDNbbm9kXSA9IFQyW25vZCoyXSArIFQyW25vZCoyKzFdOwogICAgICAgIHJldHVybjsKICAgIH0KICAgIC8vIGRlbHRhID09IDAKICAgIFQxW25vZF0gPSBUMVtub2QqMl0gKyBUMVtub2QqMisxXTsKICAgIFQyW25vZF0gPSBUMltub2QqMl0gKyBUMltub2QqMisxXTsKICAgIFQzW25vZF0gPSBUM1tub2QqMl0gKyBUM1tub2QqMisxXTsKfQoKLy9O4bq/dSAia2hv4bqjbmciIFtsLCByXSBi4buLIGJhbyBob8OgbiB0b8OgbiB0aMOsIGzhuqV5IHRvw6BuIGLhu5kKLy9O4bq/dSAia2hv4bqjbmciIFtsLCByXSBjaOG7iSBi4buLIGJhbyBt4buZdCBwaOG6p24gdsOgIGtow7RuZyBwaOG6o2kgbsO6dCBsw6EgdGjDrCBj4bqtcCBuaOG6rXQgZOG7sWEgdGhlbyBjb24KLy9O4bq/dSAia2hv4bqjbmciIGzDoSBraMO0bmcgYuG7iyBiYW8gdGjDrCBwaOG6o2kgYuG6sW5nIDAKLy9DaMO6IMO9OiBu4bq/dSBraMO0bmcgY8OzIMSRaeG7gXUga2nhu4duIChsICE9IHIpIHRow6wgc2VnbWVudCB0cmVlIGPDsyB0aOG7gyBs4bqleSBUW25vZCoyXSB24bubaSBub2QqMiBsw6AgY2jhu4kgc+G7kSB0csOgbiBuZ2/DoGkgcGjhuqFtIHZpIMSRw6Mga2hhaSBiw6FvCgp2b2lkIHVwZGF0ZShpbnQgbm9kLCBpbnQgbCwgaW50IHIsIGludCB1LCBpbnQgdiwgaW50IHZhbCl7CiAgICBpZiAociA8IHUgfHwgbCA+IHYpIHJldHVybjsKICAgIGlmIChsID49IHUgJiYgciA8PSB2KXsKICAgICAgICBkZWx0YVtub2RdICs9IHZhbDsKICAgICAgICBwdXNoX3VwKG5vZCwgbCwgcik7CiAgICAgICAgcmV0dXJuOwogICAgfQogICAgaW50IG1pZCA9IChsK3IpID4+IDE7CiAgICB1cGRhdGUobm9kKjIsIGwsIG1pZCwgdSwgdiwgdmFsKTsKICAgIHVwZGF0ZShub2QqMisxLCBtaWQrMSwgciwgdSwgdiwgdmFsKTsKICAgIHB1c2hfdXAobm9kLCBsLCByKTsKfQoKc2lnbmVkIG1haW4oKXsKICAgIGlvc19iYXNlOjpzeW5jX3dpdGhfc3RkaW8oZmFsc2UpOwogICAgY2luLnRpZSgwKTsKICAgICNkZWZpbmUgVGFzayAiQSIKICAgIGlmIChmb3BlbihUYXNrIi5pbnAiLCAiciIpKXsKICAgICAgICBmcmVvcGVuKFRhc2siLmlucCIsICJyIiwgc3RkaW4pOwogICAgICAgIGZyZW9wZW4oVGFzayIub3V0IiwgInciLCBzdGRvdXQpOwogICAgfQoKICAgIGNpbiA+PiBuOwogICAgdXAoaSwxLG4pewogICAgICAgIGludCB4MSwgeTEsIHgyLCB5MjsKICAgICAgICBjaW4gPj4geDEgPj4geTEgPj4geDIgPj4geTI7CiAgICAgICAgdGVtcFkucHVzaF9iYWNrKHkxKTsKICAgICAgICB0ZW1wWS5wdXNoX2JhY2soeTIpOwogICAgICAgIGV2ZW50cy5wdXNoX2JhY2soe3gxLCB5MSwgeTIsIDF9KTsKICAgICAgICBldmVudHMucHVzaF9iYWNrKHt4MiwgeTEsIHkyLCAtMX0pOwogICAgfQoKICAgIHRlbXBZLnB1c2hfYmFjaygtTU9EKTsKICAgIHNvcnQodGVtcFkuYmVnaW4oKSwgdGVtcFkuZW5kKCkpOwogICAgdGVtcFkucmVzaXplKHVuaXF1ZSh0ZW1wWS5iZWdpbigpLCB0ZW1wWS5lbmQoKSkgLSB0ZW1wWS5iZWdpbigpKTsKICAgIHRyZWVzaXplID0gdGVtcFkuc2l6ZSgpLTE7Ci8vICAgIHRlbXBZIHRow6ptIHBo4bqnbiB04butIC1NT0QgxJHhu4MgbOG6pXkgbG93ZXJib3VuZCB24bubaSBjaOG7iSBz4buRIGLhuq90IMSR4bqndSB04burIDEKLy8gICAgdHJlZXNpemUgPSB0ZW1wWS5zaXplKCktMSB2w6wgcGjhuqNpIGLhu48gcXVhIHBo4bqnbiB04butIC1NT0Q7CgoKICAgIHNvcnQoZXZlbnRzLmJlZ2luKCksIGV2ZW50cy5lbmQoKSwgY29tcCk7CgogICAgbG9uZyBsb25nIHJlcyA9IDA7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IChpbnQpKGV2ZW50cy5zaXplKCktMSk7IGkrKyl7CiAgICAgICAgaW50IHUgPSBsb3dlcl9ib3VuZCh0ZW1wWS5iZWdpbigpLCB0ZW1wWS5lbmQoKSwgZXZlbnRzW2ldLnkxKSAtIHRlbXBZLmJlZ2luKCk7CiAgICAgICAgaW50IHYgPSBsb3dlcl9ib3VuZCh0ZW1wWS5iZWdpbigpLCB0ZW1wWS5lbmQoKSwgZXZlbnRzW2ldLnkyKSAtIHRlbXBZLmJlZ2luKCk7CgoKICAgICAgICB1cGRhdGUoMSwgMSwgdHJlZXNpemUtMSwgdSwgdi0xLCBldmVudHNbaV0udHlwZSk7CiAgICAgICAgcmVzICs9IDFsbCAqIChUMlsxXSAtIFQzWzFdKSAqIChldmVudHNbaSsxXS54IC0gZXZlbnRzW2ldLngpOwovLyAgICAgICAgU2VnbWVudCB0cmVlIHF14bqjbiBsw70gY8OhYyAia2hv4bqjbmciIGdp4buvYSB04buNYSDEkeG7mSDEkWnhu4NtIG7DoHkgdsOgIHThu41hIMSR4buZIMSRaeG7g20ga2lhCi8vICAgICAgICBjw7MgdHJlZXNpemUgdOG7jWEgxJHhu5kgxJFp4buDbSB0aMOsIGPDsyB0cmVlc2l6ZS0xICJraG/huqNuZyIKLy8gICAgICAgIFThuqFpIG3hu5dpIG7DunQgY2jhu4kgc+G7kSB2IHF14bqjbiBsw70ga2hv4bqjbmcgW2wsIHJdLCBs4bqleSBr4bq/dCBxdeG6oyBuw7p0IG7hur91IGLhu4sgYmFvIHRvw6BuIGLhu5kgbMOgIHRlbXBZW3IrMV0gLSB0ZW1wWVtsXQovLyAgICAgICAgRG8gxJHDsywgbeG7l2kgbOG6p24gbOG6pXkga+G6v3QgcXXhuqMgdHJvbmcgdOG7jWEgxJHhu5kgW3UsIHZdIHRow6wgbOG6pXkga+G6v3QgcXXhuqMgdHLDqm4gImtob+G6o25nIiBbdSwgdi0xXSB0csOqbiBzZWdtZW50IHRyZWUKCi8vICAgICAgICBjb3V0IDw8IFQxWzFdIDw8ICIgIiA8PCBUMlsxXSA8PCAiICIgPDwgVDNbMV0gPDwgIiAiIDw8IHJlcyA8PCAiICI7Ci8vICAgICAgICBjb3V0IDw8IHUgPDwgIiAiIDw8IHYgPDwgIlxuIjsKICAgIH0KICAgIGNvdXQgPDwgcmVzOwp9CgoKCgoKCgoKCgoKLyoqQ29kZSBUcsOidSoqLwovLyNpbmNsdWRlIDxiaXRzL3N0ZGMrKy5oPgovLyNkZWZpbmUgdXAoaSxhLGIpIGZvciAoaW50IGkgPSAoaW50KWE7IGkgPD0gKGludCliOyBpKyspCi8vI2RlZmluZSBkb3duKGksYSxiKSBmb3IgKGludCBpID0gKGludClhOyBpID49IChpbnQpYjsgaS0tKQovL3VzaW5nIG5hbWVzcGFjZSBzdGQ7Ci8vCi8vY29uc3QgaW50IG1heG4gPSA1ZTIgKyAxMDsKLy9pbnQgbjsKLy9pbnQgYVttYXhuXVttYXhuXTsKLy9pbnQgTUFYWCA9IDUwMDsKLy9pbnQgTUFYWSA9IDUwMDsKLy8KLy9zaWduZWQgbWFpbigpey8vY29kZSB0cmF1Ci8vICAgIGlvc19iYXNlOjpzeW5jX3dpdGhfc3RkaW8oZmFsc2UpOwovLyAgICBjaW4udGllKDApOwovLyAgICAjZGVmaW5lIFRhc2sgIkEiCi8vICAgIGlmIChmb3BlbihUYXNrIi5pbnAiLCAiciIpKXsKLy8gICAgICAgIGZyZW9wZW4oVGFzayIuaW5wIiwgInIiLCBzdGRpbik7Ci8vICAgICAgICBmcmVvcGVuKFRhc2siLm91dCIsICJ3Iiwgc3Rkb3V0KTsKLy8gICAgfQovLwovLyAgICBpbnQgbWF4eCwgbWF4eTsKLy8gICAgbWF4eCA9IC1NQVhYOwovLyAgICBtYXh5ID0gLU1BWFg7Ci8vICAgIGNpbiA+PiBuOwovLyAgICB1cChpLDEsbil7Ci8vICAgICAgICBpbnQgeDEsIHkxLCB4MiwgeTI7Ci8vICAgICAgICBjaW4gPj4geDEgPj4geTEgPj4geDIgPj4geTI7Ci8vICAgICAgICBtYXh4ID0gbWF4KG1heHgsIHgyLTEpOwovLyAgICAgICAgbWF4eSA9IG1heChtYXh5LCB5Mi0xKTsKLy8gICAgICAgIHVwKGksIHgxLCB4Mi0xKXsKLy8gICAgICAgICAgICB1cChqLCB5MSwgeTItMSl7Ci8vICAgICAgICAgICAgICAgICsrYVtpXVtqXTsKLy8gICAgICAgICAgICB9Ci8vICAgICAgICB9Ci8vICAgIH0KLy8KLy8gICAgaW50IGNudCA9IDA7Ci8vICAgIHVwKGksMSxtYXh4KXsKLy8gICAgICAgIHVwKGosMSxtYXh5KXsKLy8gICAgICAgICAgICBpZiAoYVtpXVtqXSA9PSAyKSArK2NudDsKLy8gICAgICAgIH0KLy8gICAgfQovLyAgICBjb3V0IDw8IGNudCA8PCAiXG4iOwovLwovLwovLyAgICBkb3duKGosbWF4eSwxKXsKLy8gICAgICAgIHVwKGksMSxtYXh4KXsKLy8gICAgICAgICAgICBjb3V0IDw8IGFbaV1bal0gPDwgIiAiOwovLyAgICAgICAgfQovLyAgICAgICAgY291dCA8PCAiXG4iOwovLyAgICB9Ci8vfQo=