#include <bits/stdc++.h> using namespace std; #define rep(i,a,n) for (int i=a;i<n;i++) #define per(i,a,n) for (int i=n-1;i>=a;i--) #define pb push_back #define mp make_pair #define all(x) (x).begin(),(x).end() #define fi first #define se second #define SZ(x) ((int)(x).size()) typedef vector<int> VI; typedef long long ll; typedef pair<int,int> PII; typedef double db; const ll mod=1000000007; ll powmod(ll a,ll b) {ll res=1;a%=mod; assert(b>=0); for(;b;b>>=1){if(b&1)res=res*a%mod;a=a*a%mod;}return res;} ll gcd(ll a,ll b) { return b?gcd(b,a%b):a;} // head const int N=1001000; PII p[N],q[N]; int n,x,y,tog[N],l[N],r[N]; void ff(PII &a,int x) { if (a.fi==0) a.fi=x; if (a.se==0) a.se=x; if (a.fi>a.se) swap(a.fi,a.se); } VI vec; struct node { int fg; int cnt,len; }nd[4*N]; void upd(int p) { nd[p].cnt=max(nd[p+p].cnt,nd[p+p+1].cnt); nd[p].len=0; if (nd[p].cnt==nd[p+p].cnt) nd[p].len+=nd[p+p].len; if (nd[p].cnt==nd[p+p+1].cnt) nd[p].len+=nd[p+p+1].len; } void setf(int p,int v) { nd[p].cnt+=v; nd[p].fg+=v; } void build(int p,int l,int r) { nd[p].fg=0; nd[p].cnt=0; nd[p].len=vec[r]-vec[l-1]; if (l==r) { } else { int md=(l+r)>>1; build(p+p,l,md); build(p+p+1,md+1,r); upd(p); } } void push(int p) { if (nd[p].fg) { setf(p+p,nd[p].fg); setf(p+p+1,nd[p].fg); nd[p].fg=0; } } void modify(int p,int l,int r,int tl,int tr,int v) { //if (p==1) printf("gg %d %d %d %d %d\n",l,r,tl,tr,v); if (tl>tr) return; if (tl==l&&tr==r) return setf(p,v); else { push(p); int md=(l+r)>>1; if (tr<=md) modify(p+p,l,md,tl,tr,v); else if (tl>md) modify(p+p+1,md+1,r,tl,tr,v); else modify(p+p,l,md,tl,md,v),modify(p+p+1,md+1,r,md+1,tr,v); upd(p); } } ll solve(PII *p,int x) { vec.clear(); vec.pb(0); vec.pb(x); rep(i,0,n) vec.pb(p[i].fi),vec.pb(p[i].se); sort(all(vec)); vec.erase(unique(all(vec)),vec.end()); int m=SZ(vec)-1; build(1,1,m); rep(i,0,n) { l[i]=lower_bound(all(vec),p[i].fi)-vec.begin()+1; r[i]=lower_bound(all(vec),p[i].se)-vec.begin(); } vector<PII> evt; rep(i,0,n) tog[i]=0; rep(i,0,n) { evt.pb(mp(p[i].fi,i)); evt.pb(mp(p[i].se,i)); } int off=0; rep(i,0,n) { modify(1,1,m,l[i],r[i],-1); } sort(all(evt)); assert(nd[1].cnt==off); int ans=nd[1].len; for (auto xx:evt) { int id=xx.se; tog[id]++; if (tog[id]==1) { modify(1,1,m,l[id],r[id],2); off+=1; } else { modify(1,1,m,l[id],r[id],-2); off-=1; } if (nd[1].cnt==off) ans=max(ans,nd[1].len); } //puts("fff"); return ans; } int main() { scanf("%d%d%d",&n,&x,&y); rep(i,0,n) { scanf("%d%d",&p[i].fi,&q[i].fi); scanf("%d%d",&p[i].se,&q[i].se); ff(p[i],x); ff(q[i],y); } printf("%lld\n",solve(p,x)*solve(q,y)); }
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 125 126 127 128 | #include <bits/stdc++.h> using namespace std; #define rep(i,a,n) for (int i=a;i<n;i++) #define per(i,a,n) for (int i=n-1;i>=a;i--) #define pb push_back #define mp make_pair #define all(x) (x).begin(),(x).end() #define fi first #define se second #define SZ(x) ((int)(x).size()) typedef vector<int> VI; typedef long long ll; typedef pair<int,int> PII; typedef double db; const ll mod=1000000007; ll powmod(ll a,ll b) {ll res=1;a%=mod; assert(b>=0); for(;b;b>>=1){if(b&1)res=res*a%mod;a=a*a%mod;}return res;} ll gcd(ll a,ll b) { return b?gcd(b,a%b):a;} // head const int N=1001000; PII p[N],q[N]; int n,x,y,tog[N],l[N],r[N]; void ff(PII &a,int x) { if (a.fi==0) a.fi=x; if (a.se==0) a.se=x; if (a.fi>a.se) swap(a.fi,a.se); } VI vec; struct node { int fg; int cnt,len; }nd[4*N]; void upd(int p) { nd[p].cnt=max(nd[p+p].cnt,nd[p+p+1].cnt); nd[p].len=0; if (nd[p].cnt==nd[p+p].cnt) nd[p].len+=nd[p+p].len; if (nd[p].cnt==nd[p+p+1].cnt) nd[p].len+=nd[p+p+1].len; } void setf(int p,int v) { nd[p].cnt+=v; nd[p].fg+=v; } void build(int p,int l,int r) { nd[p].fg=0; nd[p].cnt=0; nd[p].len=vec[r]-vec[l-1]; if (l==r) { } else { int md=(l+r)>>1; build(p+p,l,md); build(p+p+1,md+1,r); upd(p); } } void push(int p) { if (nd[p].fg) { setf(p+p,nd[p].fg); setf(p+p+1,nd[p].fg); nd[p].fg=0; } } void modify(int p,int l,int r,int tl,int tr,int v) { //if (p==1) printf("gg %d %d %d %d %d\n",l,r,tl,tr,v); if (tl>tr) return; if (tl==l&&tr==r) return setf(p,v); else { push(p); int md=(l+r)>>1; if (tr<=md) modify(p+p,l,md,tl,tr,v); else if (tl>md) modify(p+p+1,md+1,r,tl,tr,v); else modify(p+p,l,md,tl,md,v),modify(p+p+1,md+1,r,md+1,tr,v); upd(p); } } ll solve(PII *p,int x) { vec.clear(); vec.pb(0); vec.pb(x); rep(i,0,n) vec.pb(p[i].fi),vec.pb(p[i].se); sort(all(vec)); vec.erase(unique(all(vec)),vec.end()); int m=SZ(vec)-1; build(1,1,m); rep(i,0,n) { l[i]=lower_bound(all(vec),p[i].fi)-vec.begin()+1; r[i]=lower_bound(all(vec),p[i].se)-vec.begin(); } vector<PII> evt; rep(i,0,n) tog[i]=0; rep(i,0,n) { evt.pb(mp(p[i].fi,i)); evt.pb(mp(p[i].se,i)); } int off=0; rep(i,0,n) { modify(1,1,m,l[i],r[i],-1); } sort(all(evt)); assert(nd[1].cnt==off); int ans=nd[1].len; for (auto xx:evt) { int id=xx.se; tog[id]++; if (tog[id]==1) { modify(1,1,m,l[id],r[id],2); off+=1; } else { modify(1,1,m,l[id],r[id],-2); off-=1; } if (nd[1].cnt==off) ans=max(ans,nd[1].len); } //puts("fff"); return ans; } int main() { scanf("%d%d%d",&n,&x,&y); rep(i,0,n) { scanf("%d%d",&p[i].fi,&q[i].fi); scanf("%d%d",&p[i].se,&q[i].se); ff(p[i],x); ff(q[i],y); } printf("%lld\n",solve(p,x)*solve(q,y)); } |