#include <stdio.h>
#include <algorithm>
using namespace std;
#define ull long long
const int z = 1e6+10;
double s[z<<3];
struct NODE {
ull l, r;
ull sum;
ull lazy;
} tree[z<<3];
#define lid(id) (id*2)
#define rid(id) (id*2+1)
#define l(id) tree[id].l
#define r(id) tree[id].r
#define sum(id) tree[id].sum
#define lazy(id) tree[id].lazy
void pushup(int id) {
if(lazy(id) > 0)
sum(id) = r(id)-l(id);
else
sum(id) = sum(lid(id))+sum(rid(id));
}
void construct(int id,int l,int r) {
if(r-l > 1) {
l(id) = s[l];
r(id) = s[r];
construct(lid(id),l,(l+r)/2);
construct(rid(id),(l+r)/2,r);
pushup(id);
} else {
l(id) = s[l];
r(id) = s[r];
tree[id].sum = 0;
}
}
void update(int id,ull y1,ull y2,ull flag) {
if(l(id) == y1&&r(id) == y2) {
lazy(id) += flag;
pushup(id);
return;
} else {
if(r(lid(id)) > y1)
update(lid(id),y1,min(r(lid(id)),y2),flag);
if(l(rid(id)) < y2)
update(rid(id),max(l(rid(id)),y1),y2,flag);
pushup(id);
}
}
struct LINE {
ull x, y1, y2;
ull flag;
bool operator < (LINE object) {
return x < object.x;
}
} line[z<<3];
void scanning_line() {
int n;
ull x1, x2, y1, y2;
scanf("%d",&n);
ull ans = 0;
for(int i = 1;i <= n;++i) {
scanf("%lld %lld %lld %lld",&x1,&y1,&x2,&y2);
line[i].x = x1;
line[i].y1 = y1;
line[i].y2 = y2;
line[i].flag = 1;
line[i+n].x = x2;
line[i+n].y1 = y1;
line[i+n].y2 = y2;
line[i+n].flag = -1;
s[i+1] = y1;
s[i+n+1] = y2;
}
sort(s+2,s+(2*n+2));
sort(line+1,line+(2*n+1));
construct(1,2,2*n+1);
update(1,line[1].y1,line[1].y2,line[1].flag);
for(int i = 2;i <= 2*n;++i) {
ans += (line[i].x-line[i-1].x)*tree[1].sum;
update(1,line[i].y1,line[i].y2,line[i].flag);
}
printf("%lld",ans);
}
signed main() {
scanning_line();
}
@bikuhiku