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);
}