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
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
// Terytoria [B]
// Jakub Rożek
#include <bits/stdc++.h>
using namespace std;

long long odp;
long long n,X,Y,q,w,e,r,vps;
vector <long long> v;
vector <long long> v2;
vector <pair<long long,long long> > vp;
vector <pair<long long,long long> > vp2;

long long rek(int i)
{
    long long wynik=0,a,b,e=0;
    a=vp[i].first;
    b=-vp[i].second;
    ++i;
    for( i; i<vps && a<b && vp[i].first<b ; ++i)
    {
        if(vp[i].first>=a)
        {
            e+=vp[i].first-a;
            if(-vp[i].second<=b) wynik=max(wynik, rek(i) );
        }

        a=max(a,-vp[i].second);
    }
    if(a<b) e+=b-a;

    wynik=max(wynik,e);

    return wynik;
}

long long licz()
{
    sort(v.begin(), v.end());
    sort(vp.begin(), vp.end());
    long long wynik=0,a=0,b,c,d,e=0;

    b=vp.size();
    vps=b;
    for(int i=0; i<b; ++i)
    {
        if(vp[i].first>=a)
        {
            e+=vp[i].first-a;
            wynik=max(wynik, rek(i) );
        }

        a=max(a,-vp[i].second);
    }
    e+=v[v.size()-1]-a;

    wynik=max(wynik,e);

    for(int i=v.size()-1; i>0; --i)
        wynik=max(wynik, v[i]-v[i-1] );

    a=0;
    for(int i=0; i<b; ++i)
    {
        while(v[a]<=vp[i].first) ++a;

        if(-vp[i].second==v[a])
        {
            e=i;
            c=a-1;
            d=a;
            while( e>=0 && vp[e].first==v[c] && -vp[e].second==v[d])
            {
                wynik=max(wynik, v[d+1]-v[d]+v[c]-v[c-1] );
                --e;
                --c;
                ++d;
            }
        }
    }

    return wynik;
}

int main()
{
    ios_base::sync_with_stdio(0);
    cin.tie(0);

    cin>>n>>X>>Y;
    v.push_back(0);
    v2.push_back(0);

    for(int i=0; i<n; ++i)
    {
        cin>>q>>w>>e>>r;
        if(q>e) swap(q,e);
        if(w>r) swap(w,r);
        v.push_back(q);
        v.push_back(e);
        v2.push_back(w);
        v2.push_back(r);
        vp.push_back({q,-e});
        vp2.push_back({w,-r});
    }
    v.push_back(X);
    v2.push_back(Y);

    odp=licz();

    for(int i=v.size()-1; i>=0; --i) v[i]=v2[i];
    for(int i=vp.size()-1; i>=0; --i)
    {
        vp[i].first=vp2[i].first;
        vp[i].second=vp2[i].second;
    }
    odp*=licz();

    cout<<odp;

    return 0;
}