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
#include <bits/stdc++.h>
using namespace std;
typedef pair<int,int> pii;
const int MX=500050;
int n,w,h,i,li,lo,ri,ro,a[MX][2],b[MX][2],where[MX][2];
bool u[2*MX];
vector<pii> x,y;
priority_queue<int> qli,qro;
priority_queue<int,vector<int>,greater<int>> qlo,qri;
int curres(const vector<pii>& x, int w) {
  if (qli.empty()) return x[qlo.top()].first+w-x[qro.top()].first;
  if (qlo.empty()) return max(0,x[qri.top()].first-x[qli.top()].first);
  li=x[qli.top()].first;
  lo=x[qlo.top()].first;
  ri=x[qri.top()].first;
  ro=x[qro.top()].first;
  if (ri<=lo || li>=ro) return ri-li;
  return max(0,lo-li)+max(0,ri-ro);
}
long long solve(const vector<pii>& x, int w) {
  memset(where,255,sizeof(where));
  memset(u,false,sizeof(u));
  while (!qli.empty()) qli.pop();
  while (!qlo.empty()) qlo.pop();
  while (!qri.empty()) qri.pop();
  while (!qro.empty()) qro.pop();
  for (int i=0; i<n; i++) {
    int k=x[i].second;
    if (where[k][0]==-1) {
      where[k][0]=i;
      qlo.push(i);
    } else {
      where[k][1]=i;
      qro.push(i);
    }
  }
  int res=curres(x,w);
  for (int i=0; i<n; i++) {
    int k=x[i].second;
    if (i==where[k][0]) {
      qli.push(i);
      u[i]=true;
      qri.push(where[k][1]); 
      u[where[k][1]]=true;
      while (!qlo.empty() && u[qlo.top()]) qlo.pop();
      while (!qro.empty() && u[qro.top()]) qro.pop();
    } else {
      qlo.push(where[k][0]);
      u[where[k][0]]=false;
      qro.push(i); 
      u[i]=false;
      while (!qli.empty() && !u[qli.top()]) qli.pop();
      while (!qri.empty() && !u[qri.top()]) qri.pop();
    }
    if (i==n-1 || x[i].first<x[i+1].first) res=max(res,curres(x,w));
  }
  return res;
}
int main () {
  scanf("%d%d%d",&n,&w,&h);
  x.resize(n*2);
  y.resize(n*2);
  for (i=0; i<n; i++) {
    scanf("%d%d%d%d",&a[i][0],&a[i][1],&b[i][0],&b[i][1]);
    x[i*2]={a[i][0],i}; x[i*2+1]={b[i][0],i};
    y[i*2]={a[i][1],i}; y[i*2+1]={b[i][1],i};
  }
  n*=2;
  sort(x.begin(),x.end());
  sort(y.begin(),y.end());
  cout<<solve(x,w)*solve(y,h);
  return 0;
}