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
122
123
124 | #include <iostream>
#include <stdio.h>
#include <math.h>
#include <string.h>
#include <time.h>
#include <stdlib.h>
#include <string>
#include <bitset>
#include <vector>
#include <set>
#include <map>
#include <queue>
#include <algorithm>
#include <sstream>
#include <stack>
#include <iomanip>
#include <assert.h>
using namespace std;
#define pb push_back
#define mp make_pair
typedef pair<int,int> pii;
typedef long long ll;
typedef double ld;
typedef vector<int> vi;
#define fi first
#define se second
#define fe first
#define FO(x) {freopen(#x".in","r",stdin);freopen(#x".out","w",stdout);}
#define Edg int M=0,fst[SZ],vb[SZ],nxt[SZ];void ad_de(int a,int b){++M;nxt[M]=fst[a];fst[a]=M;vb[M]=b;}void adde(int a,int b){ad_de(a,b);ad_de(b,a);}
#define Edgc int M=0,fst[SZ],vb[SZ],nxt[SZ],vc[SZ];void ad_de(int a,int b,int c){++M;nxt[M]=fst[a];fst[a]=M;vb[M]=b;vc[M]=c;}void adde(int a,int b,int c){ad_de(a,b,c);ad_de(b,a,c);}
#define es(x,e) (int e=fst[x];e;e=nxt[e])
#define esb(x,e,b) (int e=fst[x],b=vb[e];e;e=nxt[e],b=vb[e])
#define SZ 2234567
#define y1 yy1
#define y2 yy2
#define ln lln
int n;
const int M=1048576;
int P[SZ],Q[SZ],lls[SZ],lln,tg[SZ];
pii sg[SZ];
#define LS(w) (lower_bound(lls+1,lls+1+lln,w)-lls)
int ls[SZ],rs[SZ];
pii operator + (pii a,pii b)
{
if(a.fi!=b.fi) return max(a,b);
return pii(a.fi,a.se+b.se);
}
void pd(int x)
{
if(!tg[x]) return;
sg[x].fi+=tg[x];
if(x<=M)
tg[x+x]+=tg[x],
tg[x+x+1]+=tg[x];
tg[x]=0;
}
void upd(int x)
{
pd(x+x); pd(x+x+1);
sg[x]=sg[x+x]+sg[x+x+1];
}
void edt(int x,int l,int r,int v)
{
if(r<ls[x]||rs[x]<l) return;
pd(x);
if(l<=ls[x]&&rs[x]<=r)
{
tg[x]+=v;
return;
}
edt(x+x,l,r,v);
edt(x+x+1,l,r,v);
upd(x);
}
ll work(int m,int*p,int*q)
{
map<int,vector<int>> ps;
ps[0].clear(); lln=0;
lls[++lln]=0;
lls[++lln]=m;
for(int i=1;i<=n;++i)
{
if(p[i]>q[i]) swap(p[i],q[i]);
ps[p[i]].pb(i); ps[q[i]].pb(-i);
lls[++lln]=p[i],lls[++lln]=q[i];
}
sort(lls+1,lls+1+lln);
lln=unique(lls+1,lls+1+lln)-lls-1;
for(int i=1;i<=n;++i)
P[i]=LS(p[i]),Q[i]=LS(q[i])-1;
memset(sg,0,sizeof sg);
memset(tg,0,sizeof tg);
for(int i=0;i<M;++i)
ls[i+M]=rs[i+M]=i;
for(int i=1;i<lln;++i)
sg[i+M]=pii(1e9,lls[i+1]-lls[i]);
for(int i=M-1;i>=1;--i)
sg[i]=sg[i+i]+sg[i+i+1],
ls[i]=ls[i+i],
rs[i]=rs[i+i+1];
//total length of max
for(int i=1;i<=n;++i)
edt(1,P[i],Q[i],-1);
int ans=0;
for(auto &u:ps)
{
for(auto r:u.se)
{
int x=r;
if(r>0) edt(1,P[x],Q[x],2);
else x=-x, edt(1,P[x],Q[x],-2);
}
ans=max(ans,sg[1].se);
}
return ans;
}
int x,y,x1[SZ],y1[SZ],x2[SZ],y2[SZ];
int main()
{
scanf("%d%d%d",&n,&x,&y);
for(int i=1;i<=n;++i)
scanf("%d%d%d%d",x1+i,y1+i,x2+i,y2+i);
printf("%lld\n",work(x,x1,x2)*work(y,y1,y2));
}
|