#include<cstdio>
#include<algorithm>
using namespace std;
const int N=500010,M=2111111;
int n,m,_,X,Y,i,j,x,y,e[N][4],a[N],b[N],c[N<<1],ans;
int gl[N<<1],gr[N<<1],v[N<<1],nxt[N<<1],ed;
int cov[N<<1],mi[M],val[M],tag[M];
inline void add(int&x,int y){v[++ed]=y;nxt[ed]=x;x=ed;}
inline void tag1(int x,int p){mi[x]+=p;tag[x]+=p;}
inline void up(int x){
if(mi[x<<1]<mi[x<<1|1]){
mi[x]=mi[x<<1];
val[x]=val[x<<1];
}else if(mi[x<<1]>mi[x<<1|1]){
mi[x]=mi[x<<1|1];
val[x]=val[x<<1|1];
}else{
mi[x]=mi[x<<1];
val[x]=val[x<<1]+val[x<<1|1];
}
}
void build(int x,int a,int b){
tag[x]=0;
if(a==b){
mi[x]=cov[a];
val[x]=c[a+1]-c[a];
return;
}
int mid=(a+b)>>1;
build(x<<1,a,mid),build(x<<1|1,mid+1,b);
up(x);
}
void change(int x,int a,int b,int c,int d,int p){
if(c<=a&&b<=d){tag1(x,p);return;}
if(tag[x])tag1(x<<1,tag[x]),tag1(x<<1|1,tag[x]),tag[x]=0;
int mid=(a+b)>>1;
if(c<=mid)change(x<<1,a,mid,c,d,p);
if(d>mid)change(x<<1|1,mid+1,b,c,d,p);
up(x);
}
int solve(int all){
c[1]=0;
c[m=2]=all;
for(i=1;i<=n;i++)c[++m]=a[i],c[++m]=b[i];
sort(c+1,c+m+1);
for(_=0,i=1;i<=m;i++)if(i==1||c[i]>c[_])c[++_]=c[i];
m=_;
for(i=1;i<=m;i++)gl[i]=gr[i]=cov[i]=0;
ed=0;
for(i=1;i<=n;i++){
x=a[i],y=b[i];
if(x>y)swap(x,y);
x=lower_bound(c+1,c+m+1,x)-c;
y=lower_bound(c+1,c+m+1,y)-c;
a[i]=x;
b[i]=y;
add(gl[x],i);
add(gr[y],i);
//[x..y-1]
cov[x]++;
cov[y]--;
}
for(i=1;i<=m;i++)cov[i]+=cov[i-1];
ans=0;
build(1,1,m-1);
for(i=1;i<m;i++){
for(j=gl[i];j;j=nxt[j]){
change(1,1,m-1,a[v[j]],b[v[j]]-1,-2);
change(1,1,m-1,1,m-1,1);
}
for(j=gr[i];j;j=nxt[j]){
change(1,1,m-1,a[v[j]],b[v[j]]-1,2);
change(1,1,m-1,1,m-1,-1);
}
if(!mi[1])ans=max(ans,val[1]);
}
return ans;
}
int main(){
scanf("%d%d%d",&n,&X,&Y);
for(i=1;i<=n;i++)scanf("%d%d%d%d",&e[i][0],&e[i][1],&e[i][2],&e[i][3]);
for(i=1;i<=n;i++)a[i]=e[i][0],b[i]=e[i][2];
int ansx=solve(X);
for(i=1;i<=n;i++)a[i]=e[i][1],b[i]=e[i][3];
int ansy=solve(Y);
printf("%lld",1LL*ansx*ansy);
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 | #include<cstdio> #include<algorithm> using namespace std; const int N=500010,M=2111111; int n,m,_,X,Y,i,j,x,y,e[N][4],a[N],b[N],c[N<<1],ans; int gl[N<<1],gr[N<<1],v[N<<1],nxt[N<<1],ed; int cov[N<<1],mi[M],val[M],tag[M]; inline void add(int&x,int y){v[++ed]=y;nxt[ed]=x;x=ed;} inline void tag1(int x,int p){mi[x]+=p;tag[x]+=p;} inline void up(int x){ if(mi[x<<1]<mi[x<<1|1]){ mi[x]=mi[x<<1]; val[x]=val[x<<1]; }else if(mi[x<<1]>mi[x<<1|1]){ mi[x]=mi[x<<1|1]; val[x]=val[x<<1|1]; }else{ mi[x]=mi[x<<1]; val[x]=val[x<<1]+val[x<<1|1]; } } void build(int x,int a,int b){ tag[x]=0; if(a==b){ mi[x]=cov[a]; val[x]=c[a+1]-c[a]; return; } int mid=(a+b)>>1; build(x<<1,a,mid),build(x<<1|1,mid+1,b); up(x); } void change(int x,int a,int b,int c,int d,int p){ if(c<=a&&b<=d){tag1(x,p);return;} if(tag[x])tag1(x<<1,tag[x]),tag1(x<<1|1,tag[x]),tag[x]=0; int mid=(a+b)>>1; if(c<=mid)change(x<<1,a,mid,c,d,p); if(d>mid)change(x<<1|1,mid+1,b,c,d,p); up(x); } int solve(int all){ c[1]=0; c[m=2]=all; for(i=1;i<=n;i++)c[++m]=a[i],c[++m]=b[i]; sort(c+1,c+m+1); for(_=0,i=1;i<=m;i++)if(i==1||c[i]>c[_])c[++_]=c[i]; m=_; for(i=1;i<=m;i++)gl[i]=gr[i]=cov[i]=0; ed=0; for(i=1;i<=n;i++){ x=a[i],y=b[i]; if(x>y)swap(x,y); x=lower_bound(c+1,c+m+1,x)-c; y=lower_bound(c+1,c+m+1,y)-c; a[i]=x; b[i]=y; add(gl[x],i); add(gr[y],i); //[x..y-1] cov[x]++; cov[y]--; } for(i=1;i<=m;i++)cov[i]+=cov[i-1]; ans=0; build(1,1,m-1); for(i=1;i<m;i++){ for(j=gl[i];j;j=nxt[j]){ change(1,1,m-1,a[v[j]],b[v[j]]-1,-2); change(1,1,m-1,1,m-1,1); } for(j=gr[i];j;j=nxt[j]){ change(1,1,m-1,a[v[j]],b[v[j]]-1,2); change(1,1,m-1,1,m-1,-1); } if(!mi[1])ans=max(ans,val[1]); } return ans; } int main(){ scanf("%d%d%d",&n,&X,&Y); for(i=1;i<=n;i++)scanf("%d%d%d%d",&e[i][0],&e[i][1],&e[i][2],&e[i][3]); for(i=1;i<=n;i++)a[i]=e[i][0],b[i]=e[i][2]; int ansx=solve(X); for(i=1;i<=n;i++)a[i]=e[i][1],b[i]=e[i][3]; int ansy=solve(Y); printf("%lld",1LL*ansx*ansy); } |
English