扫描线板子.
#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
#include<map>
#include<algorithm>
using namespace std;
int n,tot;
long long ans;
map<int,map<int,long long> > la,le;
struct kkk {
int l,r,v,o;
}e[1005];
inline void pushup(int l,int r) {
int mid = (l + r) >> 1;
if(la[l][r] >= 1)
le[l][r] = r - l + 1;
else
if(l != r)
le[l][r] = le[l][mid] + le[mid+1][r];
else
le[l][r] = 0;
}
inline void ch(int L,int R,int v,int l,int r) {
if(L <= l && R >= r) {
la[l][r] += v;
pushup(l,r);
return ;
}
int mid = (l + r) >> 1;
if(L <= mid) ch(L,R,v,l,mid);
if(R > mid) ch(L,R,v,mid + 1,r);
pushup(l,r);
}
inline bool cmp(kkk aa,kkk bb) {
return aa.v < bb.v;
}
int main() {
// freopen("rec.in","r",stdin);
// freopen("rec.out","w",stdout);
scanf("%d",&n);
for(int i = 1;i <= n; i++) {
int x1,y1,x2,y2;
scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
e[++tot].l = y1 + 100000001;
e[tot].r = y2 + 100000001;
e[tot].v = x1 + 100000001;
e[tot].o = 1;
e[++tot].l = y1 + 100000001;
e[tot].r = y2 + 100000001;
e[tot].v = x2 + 100000001;
e[tot].o = -1;
}
sort(e+1,e+tot+1,cmp);
for(int i = 1;i <= tot; i++) {
ans += le[1][200000002] * (e[i].v - e[i-1].v);
ch(e[i].l,e[i].r - 1,e[i].o,1,200000002);
}
printf("%lld",ans);
return 0;
}