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
#include <iostream>
#include <climits>
#include <algorithm>
#include <vector>
#include <stack>
#include <map>
#include <cmath>
#include <tuple>

using namespace std;

int N, L, X, Y;

vector<pair<pair<int, int>, int>> T;
vector<int> X2i, Y2i;
vector<pair<int, int>> XX, YY;

pair <int, int> f(const pair<pair<int, int>, int> &L, const pair<pair<int, int>, int> &R) {
    return {(L.second ? L.first.second : L.first.first) + (R.second ? R.first.second : R.first.first), L.first.second + R.first.second};
}

int fff(const pair<pair<int, int>, int> &L, const pair<pair<int, int>, int> &R) {
    return (L.second ? L.first.second : L.first.first) + (R.second ? R.first.second : R.first.first);
}

void add(int l, int r, int x, int y=0) {
    if (l==r) return;
    if (l>r) {
         add(r, l, y, x);
//         add(0, r, x);
//         add(l, L-1, x);
        return;
    }
    l+=L;
    r+=L;
    T[l].second+=x;
    T[r].second+=y;
    while (l/2!=r/2) {
        if (l%2==0) T[l+1].second+=x;
        else T[l-1].second+=y;
        if (r%2==1) T[r-1].second+=x;
        else T[r+1].second+=y;
        l/=2;
        r/=2;
        T[l].first.first=fff(T[2*l], T[2*l+1]);
        T[r].first.first=fff(T[2*r], T[2*r+1]);
//         T[l].first=f(T[2*l], T[2*l+1]);
//         T[r].first=f(T[2*r], T[2*r+1]);
    }
    while (l>1) {
        l/=2;
        T[l].first.first=fff(T[2*l], T[2*l+1]);
//        T[l].first=f(T[2*l], T[2*l+1]);
        T[l^1].second+=y;
    }
}

int main() {
    ios::sync_with_stdio(false);
    cin >> N >> X >> Y;
    X2i.push_back(0);
    X2i.push_back(X);
    Y2i.push_back(0);
    Y2i.push_back(Y);
    for (int i=0; i<N; i++) {
        int x1, y1, x2, y2;
        cin >> x1 >> y1>> x2 >> y2;
        if (x1>x2) swap(x1, x2);
        if (y1>y2) swap(y1, y2);
        X2i.push_back(x1);
        X2i.push_back(x2);
        Y2i.push_back(y1);
        Y2i.push_back(y2);
        XX.emplace_back(x1, x2);
        XX.emplace_back(x2, x1);
        YY.emplace_back(y1, y2);
        YY.emplace_back(y2, y1);
    }
    
    long long res=1;
    for (int kkk=0; kkk<2; kkk++){
        sort(X2i.begin(), X2i.end());
        X2i.resize(unique(X2i.begin(), X2i.end())-X2i.begin());
        sort(XX.begin(), XX.end());
        
        L=1;
        while (L<=(int)X2i.size()) L*=2;
        T.clear();
        T.resize(2*L);
        for (int i=0; i<(int)X2i.size()-1; i++){
            T[L+i].first.second=X2i[i+1]-X2i[i];
        }
        for(int i=L-1; i>0; i--) {
            T[i].first=f(T[2*i], T[2*i+1]);
        }
        for (auto p:XX) {
            if (p.first>p.second)
                continue;
            int idx1=lower_bound(X2i.begin(), X2i.end(), p.first)-X2i.begin();
            int idx2=lower_bound(X2i.begin(), X2i.end(), p.second)-X2i.begin();
            add(idx1, idx2, 1);
        }
        int lRes=X-T[1].first.first;
//        cout << "!!! "  << lRes << endl;
        for (auto p:XX) {
            int idx1=lower_bound(X2i.begin(), X2i.end(), p.first)-X2i.begin();
            int idx2=lower_bound(X2i.begin(), X2i.end(), p.second)-X2i.begin();
            add(idx1, idx2, -1, 1);
//            add(idx1, idx2, -1);
//            add(idx2, idx1, 1);
            lRes=max(lRes,X-T[1].first.first);
//            cout << "!!! "  << lRes << endl;
        }
        
        res*=lRes;
        X2i=Y2i;
        XX=YY;
        X=Y;
    }
    cout << res << endl;
}