#include<bits/stdc++.h>
using namespace std;
int n,a,b,c,d;
struct Data{
int val,hi,x,y;
}r[200010];
bool cmp(Data a,Data b){
return a.hi>=b.hi;
}
class SegmentTree{
public:
int cov[800010],qz[800010],val[800010],lay[800010];
void Pushup(int u){
if(cov[u]) val[u]=qz[u];
else val[u]=val[u<<1]+val[u<<1|1];
}
void Build(int l,int r,int u,int *x){
if(l==r){qz[u]=x[l];return;}
int m=l+r>>1;
Build(l,m,u<<1,x); Build(m+1,r,u<<1|1,x);
Pushup(u); qz[u]=qz[u<<1]+qz[u<<1|1];
}
void Update(int l,int r,int tl,int tr,int u,int x){
if(tl<=l&&r<=tr){
cov[u]+=x; Pushup(u);
//printf("%d %d %d %d %d\n",u,l,r,cov[u],val[u]);
return;
}
int m=l+r>>1;
if(tl<=m) Update(l,m,tl,tr,u<<1,x);
if(m+1<=tr) Update(m+1,r,tl,tr,u<<1|1,x);
//printf("%d %d *\n",u,cov[u]);
Pushup(u);
}
int Query(){return val[1];}
}seg;
int val[200010],x[200010];
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d%d%d%d",&a,&b,&c,&d);
val[2*i-1]=b; val[2*i]=d;
r[2*i-1]=(Data){-1,a,b,d};
r[2*i]=(Data){1,c,b,d};
}
sort(val+1,val+2*n+1);
int nwlen=unique(val+1,val+2*n+1)-val;
for(int i=1;i<=2*n;i++){
if(i>1) x[i-1]=val[i]-val[i-1];
r[i].x=lower_bound(val+1,val+nwlen+1,r[i].x)-val;
r[i].y=lower_bound(val+1,val+nwlen+1,r[i].y)-val-1;
}
int m=2*n-1;
seg.Build(1,m,1,x);
sort(r+1,r+2*n+1,cmp);
long long ans=0;
seg.Update(1,m,r[1].x,r[1].y,1,r[1].val);
for(int i=2;i<=2*n;i++){
//printf("%d\n",seg.Query()*(long long)(r[i-1].hi-r[i].hi));
ans+=seg.Query()*(long long)(r[i-1].hi-r[i].hi);
seg.Update(1,m,r[i].x,r[i].y,1,r[i].val);
}
printf("%lld",ans);
}
后来试了一下数组再开大4倍也没用