#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;
};
//events in sweep line
//there are 2 type of events: opening and closing, represented by 1 and -1
bool comp(EVENT& A, EVENT& B){
if (A.x == B.x) return A.type > B.type;
return A.x < B.x;
}
// Sort events by x; if equal, process "opening" events before "closing"
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 for the maximum number of possible events (each rectangle adds one open and one close event)
// maxn << 3 as an upper bound for the segment tree size over all events
void push_up(int nod, int l, int r){
int len = tempY[r+1] - tempY[l];
if (delta[nod] >= 3) {
// whole interval has +3 -> full length for all tree at this node
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 -> >=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];
}
// If interval [l, r] is fully covered, take the full segment
// If [l, r] is partially covered (and not a leaf), update based on children
// If the leaf is not covered, its value must be 0
// Warning: Without (l != r) case, segment tree might access child indices outside the declared range
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 includes an extra element -MOD so lower_bound starts from index 1
// treesize = tempY.size() - 1 because we ignore the -MOD element
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();
// u and v are 1-based indexing
update(1, 1, treesize-1, u, v-1, events[i].type);
res += 1ll * (T2[1] - T3[1]) * (events[i+1].x - events[i].x);
// The segment tree manages "intervals" between consecutive coordinates
// With treesize coordinate points, there are treesize-1 intervals
// Each node with index v manages the interval [l, r]; when fully covered, its length is tempY[r+1] - tempY[l]
// Thus, each query on coordinate range [u, v] corresponds to interval [u, v-1] in the segment tree
}
cout << res;
}
//#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(){
// 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+CiNkZWZpbmUgdXAoaSxhLGIpIGZvciAoaW50IGkgPSAoaW50KWE7IGkgPD0gKGludCliOyBpKyspCnVzaW5nIG5hbWVzcGFjZSBzdGQ7Cgpjb25zdCBpbnQgbWF4biA9IDFlNSArIDEwOwpjb25zdCBpbnQgTU9EID0gMWU5ICsgNzsKc3RydWN0IEVWRU5UewogICAgaW50IHg7CiAgICBpbnQgeTE7CiAgICBpbnQgeTI7CiAgICBpbnQgdHlwZTsKfTsKLy9ldmVudHMgaW4gc3dlZXAgbGluZQovL3RoZXJlIGFyZSAyIHR5cGUgb2YgZXZlbnRzOiBvcGVuaW5nIGFuZCBjbG9zaW5nLCByZXByZXNlbnRlZCBieSAxIGFuZCAtMQoKYm9vbCBjb21wKEVWRU5UJiBBLCBFVkVOVCYgQil7CiAgICBpZiAoQS54ID09IEIueCkgcmV0dXJuIEEudHlwZSA+IEIudHlwZTsKICAgIHJldHVybiBBLnggPCBCLng7Cn0KLy8gU29ydCBldmVudHMgYnkgeDsgaWYgZXF1YWwsIHByb2Nlc3MgIm9wZW5pbmciIGV2ZW50cyBiZWZvcmUgImNsb3NpbmciCgp2ZWN0b3I8RVZFTlQ+IGV2ZW50czsKdmVjdG9yPGludD4gdGVtcFk7CgppbnQgbiwgdHJlZXNpemU7CmxvbmcgbG9uZyBUMVttYXhuIDw8IDNdOwpsb25nIGxvbmcgVDJbbWF4biA8PCAzXTsKbG9uZyBsb25nIFQzW21heG4gPDwgM107CmludCBkZWx0YVttYXhuIDw8IDNdOwovLyBtYXhuIDw8IDEgZm9yIHRoZSBtYXhpbXVtIG51bWJlciBvZiBwb3NzaWJsZSBldmVudHMgKGVhY2ggcmVjdGFuZ2xlIGFkZHMgb25lIG9wZW4gYW5kIG9uZSBjbG9zZSBldmVudCkKLy8gbWF4biA8PCAzIGFzIGFuIHVwcGVyIGJvdW5kIGZvciB0aGUgc2VnbWVudCB0cmVlIHNpemUgb3ZlciBhbGwgZXZlbnRzCgp2b2lkIHB1c2hfdXAoaW50IG5vZCwgaW50IGwsIGludCByKXsKICAgIGludCBsZW4gPSB0ZW1wWVtyKzFdIC0gdGVtcFlbbF07CiAgICBpZiAoZGVsdGFbbm9kXSA+PSAzKSB7CiAgICAvLyAgd2hvbGUgaW50ZXJ2YWwgaGFzICszIC0+IGZ1bGwgbGVuZ3RoIGZvciBhbGwgdHJlZSBhdCB0aGlzIG5vZGUKICAgICAgICBUM1tub2RdID0gVDJbbm9kXSA9IFQxW25vZF0gPSBsZW47CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIGlmIChsID09IHIpewogICAgICAgIC8vIGxlYWYKICAgICAgICBpZiAoZGVsdGFbbm9kXSA9PSAyKSAgICAgIFQxW25vZF0gPSBUMltub2RdID0gbGVuLCBUM1tub2RdID0gMDsKICAgICAgICBlbHNlIGlmIChkZWx0YVtub2RdID09IDEpIFQxW25vZF0gPSBsZW4sIFQyW25vZF0gPSBUM1tub2RdID0gMDsKICAgICAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgIFQxW25vZF0gPSBUMltub2RdID0gVDNbbm9kXSA9IDA7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIGlmIChkZWx0YVtub2RdID09IDIpewogICAgICAgIC8vIHdob2xlIGludGVydmFsIGhhcyArMiAtPiA+PTEgYW5kID49MiBhcmUgZnVsbCBsZW5ndGgKICAgICAgICBUMVtub2RdID0gVDJbbm9kXSA9IGxlbjsKICAgICAgICAvLyBwYXJ0cyB0aGF0IGJlY29tZSA+PTMgYXJlIHdoZXJlIGNoaWxkcmVuIGhhZCA+PTEKICAgICAgICBUM1tub2RdID0gVDFbbm9kKjJdICsgVDFbbm9kKjIrMV07CiAgICAgICAgcmV0dXJuOwogICAgfQogICAgaWYgKGRlbHRhW25vZF0gPT0gMSl7CiAgICAgICAgLy8gd2hvbGUgaW50ZXJ2YWwgaGFzICsxIC0+ID49MSBpcyBmdWxsIGxlbmd0aAogICAgICAgIFQxW25vZF0gPSBsZW47CiAgICAgICAgLy8gPj0yIGFyZSBwb3NpdGlvbnMgd2hlcmUgY2hpbGQgaGFkID49MQogICAgICAgIFQyW25vZF0gPSBUMVtub2QqMl0gKyBUMVtub2QqMisxXTsKICAgICAgICAvLyA+PTMgYXJlIHBvc2l0aW9ucyB3aGVyZSBjaGlsZCBoYWQgPj0yCiAgICAgICAgVDNbbm9kXSA9IFQyW25vZCoyXSArIFQyW25vZCoyKzFdOwogICAgICAgIHJldHVybjsKICAgIH0KICAgIC8vIGRlbHRhID09IDAKICAgIFQxW25vZF0gPSBUMVtub2QqMl0gKyBUMVtub2QqMisxXTsKICAgIFQyW25vZF0gPSBUMltub2QqMl0gKyBUMltub2QqMisxXTsKICAgIFQzW25vZF0gPSBUM1tub2QqMl0gKyBUM1tub2QqMisxXTsKfQovLyBJZiBpbnRlcnZhbCBbbCwgcl0gaXMgZnVsbHkgY292ZXJlZCwgdGFrZSB0aGUgZnVsbCBzZWdtZW50Ci8vIElmIFtsLCByXSBpcyBwYXJ0aWFsbHkgY292ZXJlZCAoYW5kIG5vdCBhIGxlYWYpLCB1cGRhdGUgYmFzZWQgb24gY2hpbGRyZW4KLy8gSWYgdGhlIGxlYWYgaXMgbm90IGNvdmVyZWQsIGl0cyB2YWx1ZSBtdXN0IGJlIDAKLy8gV2FybmluZzogV2l0aG91dCAobCAhPSByKSBjYXNlLCBzZWdtZW50IHRyZWUgbWlnaHQgYWNjZXNzIGNoaWxkIGluZGljZXMgb3V0c2lkZSB0aGUgZGVjbGFyZWQgcmFuZ2UKCnZvaWQgdXBkYXRlKGludCBub2QsIGludCBsLCBpbnQgciwgaW50IHUsIGludCB2LCBpbnQgdmFsKXsKICAgIGlmIChyIDwgdSB8fCBsID4gdikgcmV0dXJuOwogICAgaWYgKGwgPj0gdSAmJiByIDw9IHYpewogICAgICAgIGRlbHRhW25vZF0gKz0gdmFsOwogICAgICAgIHB1c2hfdXAobm9kLCBsLCByKTsKICAgICAgICByZXR1cm47CiAgICB9CiAgICBpbnQgbWlkID0gKGwrcikgPj4gMTsKICAgIHVwZGF0ZShub2QqMiwgbCwgbWlkLCB1LCB2LCB2YWwpOwogICAgdXBkYXRlKG5vZCoyKzEsIG1pZCsxLCByLCB1LCB2LCB2YWwpOwogICAgcHVzaF91cChub2QsIGwsIHIpOwp9CgpzaWduZWQgbWFpbigpewogICAgaW9zX2Jhc2U6OnN5bmNfd2l0aF9zdGRpbyhmYWxzZSk7CiAgICBjaW4udGllKDApOwogICAgI2RlZmluZSBUYXNrICJBIgogICAgaWYgKGZvcGVuKFRhc2siLmlucCIsICJyIikpewogICAgICAgIGZyZW9wZW4oVGFzayIuaW5wIiwgInIiLCBzdGRpbik7CiAgICAgICAgZnJlb3BlbihUYXNrIi5vdXQiLCAidyIsIHN0ZG91dCk7CiAgICB9CgogICAgY2luID4+IG47CiAgICB1cChpLDEsbil7CiAgICAgICAgaW50IHgxLCB5MSwgeDIsIHkyOwogICAgICAgIGNpbiA+PiB4MSA+PiB5MSA+PiB4MiA+PiB5MjsKICAgICAgICB0ZW1wWS5wdXNoX2JhY2soeTEpOwogICAgICAgIHRlbXBZLnB1c2hfYmFjayh5Mik7CiAgICAgICAgZXZlbnRzLnB1c2hfYmFjayh7eDEsIHkxLCB5MiwgMX0pOwogICAgICAgIGV2ZW50cy5wdXNoX2JhY2soe3gyLCB5MSwgeTIsIC0xfSk7CiAgICB9CgogICAgdGVtcFkucHVzaF9iYWNrKC1NT0QpOwogICAgc29ydCh0ZW1wWS5iZWdpbigpLCB0ZW1wWS5lbmQoKSk7CiAgICB0ZW1wWS5yZXNpemUodW5pcXVlKHRlbXBZLmJlZ2luKCksIHRlbXBZLmVuZCgpKSAtIHRlbXBZLmJlZ2luKCkpOwogICAgdHJlZXNpemUgPSB0ZW1wWS5zaXplKCktMTsKCS8vIHRlbXBZIGluY2x1ZGVzIGFuIGV4dHJhIGVsZW1lbnQgLU1PRCBzbyBsb3dlcl9ib3VuZCBzdGFydHMgZnJvbSBpbmRleCAxCgkvLyB0cmVlc2l6ZSA9IHRlbXBZLnNpemUoKSAtIDEgYmVjYXVzZSB3ZSBpZ25vcmUgdGhlIC1NT0QgZWxlbWVudAoKCiAgICBzb3J0KGV2ZW50cy5iZWdpbigpLCBldmVudHMuZW5kKCksIGNvbXApOwoKICAgIGxvbmcgbG9uZyByZXMgPSAwOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCAoaW50KShldmVudHMuc2l6ZSgpLTEpOyBpKyspewogICAgICAgIGludCB1ID0gbG93ZXJfYm91bmQodGVtcFkuYmVnaW4oKSwgdGVtcFkuZW5kKCksIGV2ZW50c1tpXS55MSkgLSB0ZW1wWS5iZWdpbigpOwogICAgICAgIGludCB2ID0gbG93ZXJfYm91bmQodGVtcFkuYmVnaW4oKSwgdGVtcFkuZW5kKCksIGV2ZW50c1tpXS55MikgLSB0ZW1wWS5iZWdpbigpOwoJCS8vIHUgYW5kIHYgYXJlIDEtYmFzZWQgaW5kZXhpbmcKCiAgICAgICAgdXBkYXRlKDEsIDEsIHRyZWVzaXplLTEsIHUsIHYtMSwgZXZlbnRzW2ldLnR5cGUpOwogICAgICAgIHJlcyArPSAxbGwgKiAoVDJbMV0gLSBUM1sxXSkgKiAoZXZlbnRzW2krMV0ueCAtIGV2ZW50c1tpXS54KTsKCQkvLyBUaGUgc2VnbWVudCB0cmVlIG1hbmFnZXMgImludGVydmFscyIgYmV0d2VlbiBjb25zZWN1dGl2ZSBjb29yZGluYXRlcwoJCS8vIFdpdGggdHJlZXNpemUgY29vcmRpbmF0ZSBwb2ludHMsIHRoZXJlIGFyZSB0cmVlc2l6ZS0xIGludGVydmFscwoJCS8vIEVhY2ggbm9kZSB3aXRoIGluZGV4IHYgbWFuYWdlcyB0aGUgaW50ZXJ2YWwgW2wsIHJdOyB3aGVuIGZ1bGx5IGNvdmVyZWQsIGl0cyBsZW5ndGggaXMgdGVtcFlbcisxXSAtIHRlbXBZW2xdCgkJLy8gVGh1cywgZWFjaCBxdWVyeSBvbiBjb29yZGluYXRlIHJhbmdlIFt1LCB2XSBjb3JyZXNwb25kcyB0byBpbnRlcnZhbCBbdSwgdi0xXSBpbiB0aGUgc2VnbWVudCB0cmVlCiAgICB9CiAgICBjb3V0IDw8IHJlczsKfQoKCgoKCgoKCgoKCi8vI2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+Ci8vI2RlZmluZSB1cChpLGEsYikgZm9yIChpbnQgaSA9IChpbnQpYTsgaSA8PSAoaW50KWI7IGkrKykKLy8jZGVmaW5lIGRvd24oaSxhLGIpIGZvciAoaW50IGkgPSAoaW50KWE7IGkgPj0gKGludCliOyBpLS0pCi8vdXNpbmcgbmFtZXNwYWNlIHN0ZDsKLy8KLy9jb25zdCBpbnQgbWF4biA9IDVlMiArIDEwOwovL2ludCBuOwovL2ludCBhW21heG5dW21heG5dOwovL2ludCBNQVhYID0gNTAwOwovL2ludCBNQVhZID0gNTAwOwovLwovL3NpZ25lZCBtYWluKCl7Ci8vICAgIGlvc19iYXNlOjpzeW5jX3dpdGhfc3RkaW8oZmFsc2UpOwovLyAgICBjaW4udGllKDApOwovLyAgICAjZGVmaW5lIFRhc2sgIkEiCi8vICAgIGlmIChmb3BlbihUYXNrIi5pbnAiLCAiciIpKXsKLy8gICAgICAgIGZyZW9wZW4oVGFzayIuaW5wIiwgInIiLCBzdGRpbik7Ci8vICAgICAgICBmcmVvcGVuKFRhc2siLm91dCIsICJ3Iiwgc3Rkb3V0KTsKLy8gICAgfQovLwovLyAgICBpbnQgbWF4eCwgbWF4eTsKLy8gICAgbWF4eCA9IC1NQVhYOwovLyAgICBtYXh5ID0gLU1BWFg7Ci8vICAgIGNpbiA+PiBuOwovLyAgICB1cChpLDEsbil7Ci8vICAgICAgICBpbnQgeDEsIHkxLCB4MiwgeTI7Ci8vICAgICAgICBjaW4gPj4geDEgPj4geTEgPj4geDIgPj4geTI7Ci8vICAgICAgICBtYXh4ID0gbWF4KG1heHgsIHgyLTEpOwovLyAgICAgICAgbWF4eSA9IG1heChtYXh5LCB5Mi0xKTsKLy8gICAgICAgIHVwKGksIHgxLCB4Mi0xKXsKLy8gICAgICAgICAgICB1cChqLCB5MSwgeTItMSl7Ci8vICAgICAgICAgICAgICAgICsrYVtpXVtqXTsKLy8gICAgICAgICAgICB9Ci8vICAgICAgICB9Ci8vICAgIH0KLy8KLy8gICAgaW50IGNudCA9IDA7Ci8vICAgIHVwKGksMSxtYXh4KXsKLy8gICAgICAgIHVwKGosMSxtYXh5KXsKLy8gICAgICAgICAgICBpZiAoYVtpXVtqXSA9PSAyKSArK2NudDsKLy8gICAgICAgIH0KLy8gICAgfQovLyAgICBjb3V0IDw8IGNudCA8PCAiXG4iOwovLwovLwovLyAgICBkb3duKGosbWF4eSwxKXsKLy8gICAgICAgIHVwKGksMSxtYXh4KXsKLy8gICAgICAgICAgICBjb3V0IDw8IGFbaV1bal0gPDwgIiAiOwovLyAgICAgICAgfQovLyAgICAgICAgY291dCA8PCAiXG4iOwovLyAgICB9Ci8vfQo=