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 #include #include #include #include #include using namespace std; #define FOR(i,a,b) for(int (i)=(a); (i)!=(b); ++(i)) struct Segment { int L, R, count; Segment(){}; Segment(int L, int R) { this->count = 0; this->L = L; this->R = R; } }; void cover(vector &segments, int L, int R) { FOR(i,0,segments.size()) { if (segments[i].L >= L && segments[i].R <= R) { ++segments[i].count; } } } unsigned long long int solve(vector > &P, int MAX) { set S; S.insert(0); S.insert(MAX); FOR(i,0,P.size()) S.insert(P[i].first); FOR(i,0,P.size()) S.insert(P[i].second); vector points(S.begin(), S.end()); sort(points.begin(), points.end()); vector segments(points.size() - 1); FOR(i,0,points.size() - 1) segments[i] = Segment(points[i], points[i+1]); int result = 0; FOR(i,0,segments.size()) { FOR(j,0,segments.size()) segments[j].count = 0; FOR(j,0,P.size()) { if (P[j].first <= segments[i].L && segments[i].R <= P[j].second) { cover(segments, P[j].first, P[j].second); } else { cover(segments, 0, P[j].first); cover(segments, P[j].second, MAX); } } int subresult = 0; FOR(j,0,segments.size()) { if (segments[j].count == P.size()) { subresult += segments[j].R - segments[j].L; } } result = max(result, subresult); } return result; } int n, X, Y, x1, y1, x2, y2; int main() { scanf("%d %d %d", &n, &X, &Y); vector > V(n), H(n); FOR(i,0,n) { scanf("%d %d %d %d", &x1, &y1, &x2, &y2); if (x1 > x2) swap(x1, x2); if (y1 > y2) swap(y1, y2); H[i] = make_pair(x1, x2); V[i] = make_pair(y1, y2); } printf("%llu\n", solve(H, X) * solve(V, Y)); }