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
88
89
90
91
92
93
94
//created by Albert Mosialek
#include<bits/stdc++.h>
using namespace std;
int n,X,Y, currentId;
long long poleX, poleY, pole;
int poleXInt, poleYInt;
struct LabeledPoint{int l; int id;};
LabeledPoint xPoints[1000001];
LabeledPoint yPoints[1000001];
bool visited[1000001];
int idToHash[500001];
map<int, int> HashToArea;
const int prime = 982451653;
bool LabeledPointComparator( LabeledPoint first,  LabeledPoint second)
{
    return first.l < second.l;
}

int xD(LabeledPoint* points, int L){
    HashToArea.clear();
   //cerr<<HashToArea[0]<<endl;
    int poleInt = 0;
    int n2=2*n;
    sort(points, points+n2, LabeledPointComparator);
    int currentHash = 0;
    HashToArea[currentHash] = points[0].l;
    currentHash += idToHash[points[0].id];
   //cerr<<"Adding to currentHash"<<idToHash[xPoints[0].id]<<endl;
    visited[points[0].id]=1;
    for(int i=1;i<n2;i++)
    {
        HashToArea[currentHash] += points[i].l - points[i-1].l;
        int tmp = HashToArea[currentHash];
        if(tmp>poleInt)
            poleInt=tmp;
        currentId = points[i].id;
        if(visited[currentId])
        {
           //cerr<<"Adding to currentHash"<<(prime - idToHash[currentId]) % prime<<endl;
            currentHash = (currentHash + prime - idToHash[currentId]) % prime;
        }
        else
        {
           //cerr<<"Adding to currentHash"<<(idToHash[currentId])<<endl;
            currentHash = (currentHash + idToHash[currentId]) % prime;
        }
        visited[currentId] = !visited[currentId];
        
    }
    currentHash=0;
    HashToArea[currentHash] += L - points[n2-1].l;
    visited[points[n2-1].id]=0;
    if(HashToArea[0]>poleInt)
        poleInt=HashToArea[0];
   //cerr<<"HashToArea"<<endl;
    for (std::map<int,int>::iterator it=HashToArea.begin(); it!=HashToArea.end(); ++it)
       //cerr << it->first << " => " << it->second << '\n';
   //cerr<<"points:"<<endl;
    for(int i=0;i<n2;i++)
       //cerr<< points[i].l <<endl;
    

    return poleInt;
}
int main()
{
    ios_base::sync_with_stdio(0);
    
    cin>>n>>X>>Y;

    int currentHash=1;
    for(int i=0;i<n+1;i++)
    {
        idToHash[i]=currentHash;
        currentHash = (currentHash * 2) % prime;
    }

    for(int i = 0;i<=n;i++)
    {
        cin >> xPoints[2*i].l >> yPoints[2*i].l >> xPoints[2*i+1].l >> yPoints[2*i+1].l;
        xPoints[2*i].id=yPoints[2*i].id=xPoints[2*i+1].id=yPoints[2*i+1].id=i;
    }

    

    poleXInt = xD(xPoints,X);
   //cerr<<"-------------------------------------------------"<<endl;
    poleYInt = xD(yPoints,Y);
    poleX = poleXInt;
    poleY = poleYInt;
    pole = poleX*poleY;
    cout<<pole<<endl;
    return 0;
}