#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 mp make_pair
#define pb push_back
typedef double db;
const db EPS = 1e-8;
const db INF = 1e100;
inline int sign(db x, db E = EPS){return x<-E?-1:x>E;}
inline int cmp(db a,db b,db E = EPS){return sign(a-b, E);}
struct P{
db x,y;
P operator+(P o){return {x+o.x,y+o.y};}
P operator-(P o){return {x-o.x,y-o.y};}
P operator-(){ return {-x,-y}; }
db det(P o){return x*o.y-y*o.x;}
db dot(P o){return x*o.x+y*o.y;}
P operator*(db d) { return {x * d, y * d}; }
P operator/(db d) { return {x / d, y / d}; }
bool operator<(P o) const { return cmp(x,o.x) != 0? cmp(x,o.x) == -1 : cmp(y,o.y) == -1; }
bool operator>(P o) const { return cmp(x,o.x) != 0? cmp(x,o.x) == 1 : cmp(y,o.y) == 1; }
bool operator==(P o){ return cmp(x,o.x) == 0 && cmp(y,o.y) == 0; }
void read(){
scanf("%lf%lf",&x,&y);
}
db abs() { return sqrt(abs2());}
db abs2() { return x * x + y * y; }
P rot90() { return {-y,x};}
P unit() { return *this/abs(); }
}O = (P){0,0};
#define cross(p1,p2,p3) ((p2.x-p1.x)*(p3.y-p1.y)-(p3.x-p1.x)*(p2.y-p1.y))
#define crossOp(p1,p2,p3) sign(cross(p1,p2,p3))
P isLL(P p1, P p2, P q1, P q2) {
db a1 = cross(q1, q2, p1), a2 = -cross(q1, q2, p2);
return (p1 * a2 + p2 * a1) / (a1 + a2);
}
vector<P> convexHull(vector<P> ps) {
int n = ps.size(); if(n <= 1) return ps;
sort(ps.begin(), ps.end());
vector<P> qs(n * 2); int k = 0;
for (int i = 0; i < n; qs[k++] = ps[i++])
while (k > 1 && crossOp(qs[k - 2], qs[k - 1], ps[i]) <= 0) --k;
for (int i = n - 2, t = k; i >= 0; qs[k++] = ps[i--])
while (k > t && crossOp(qs[k - 2], qs[k - 1], ps[i]) <= 0) --k;
qs.resize(k - 1);
return qs;
}
struct CH{
int n;
vector<P> ps, lower, upper;
P operator[](int i){return ps[i];}
int find(vector<P>&vec, P dir){
int l=0,r=vec.size();
while(l+5<r){
int L = (l*2+r)/3, R = (l+r*2)/3;
if(vec[L].dot(dir) > vec[R].dot(dir))
r=R;
else
l=L;
}
int ret = l; rep(k,l+1,r) if(vec[k].dot(dir) > vec[ret].dot(dir)) ret = k;
return ret;
}
/*
ps[0] must be the smallest one!
*/
void init(vector<P> _ps){
ps = _ps; n = ps.size();
rotate(ps.begin(),min_element(ps.begin(), ps.end()),ps.end());
int at = max_element(ps.begin(), ps.end()) - ps.begin();
lower = vector<P>(ps.begin(),ps.begin() + at + 1);
upper = vector<P>(ps.begin()+at,ps.end()); upper.pb(ps[0]);
}
int findFarest(P dir){
if(dir.y > 0 || dir.y==0 && dir.x > 0){
return ( (int)lower.size() -1 + find(upper,dir)) % n;
} else {
return find(lower,dir);
}
}
P get(int l,int r,P p1,P p2){
int sl = crossOp(p1,p2,ps[l%n]);
while(l+1<r){
int m = (l+r)>>1;
if(crossOp(p1,p2,ps[m%n]) == sl)
l = m;
else
r = m;
}
return isLL(p1,p2,ps[l%n],ps[(l+1)%n]);
}
vector<P> getIS(P p1,P p2){
int X = findFarest((p2-p1).rot90());
int Y = findFarest((p1-p2).rot90());
if(X > Y) swap(X,Y);
if(crossOp(p1,p2,ps[X]) * crossOp(p1,p2,ps[Y]) < 0){
return {get(X,Y,p1,p2),get(Y,X+n,p1,p2)};
} else {
return {};
}
}
void update_tangent(P p, int id, int&a,int&b){
if(crossOp(p,ps[a],ps[id]) > 0) a = id;
if(crossOp(p,ps[b],ps[id]) < 0) b = id;
}
void binary_search(int l,int r,P p,int&a,int&b){
if(l==r) return;
update_tangent(p,l%n,a,b);
int sl = crossOp(p,ps[l%n],ps[(l+1)%n]);
while(l+1<r){
int m = l+r>>1;
if(crossOp(p,ps[m%n],ps[(m+1)%n]) == sl)
l=m;
else
r=m;
}
update_tangent(p,r%n,a,b);
}
bool contain(P p){
if(p.x < lower[0].x || p.x > lower.back().x) return 0;
int id = lower_bound(lower.begin(), lower.end(),(P){p.x,-INF}) - lower.begin();
if(lower[id].x == p.x){
if(lower[id].y > p.y) return 0;
} else {
if(crossOp(lower[id-1],lower[id],p) < 0) return 0;
}
id = lower_bound(upper.begin(), upper.end(),(P){p.x,INF},greater<P>()) - upper.begin();
if(upper[id].x == p.x){
if(upper[id].y < p.y) return 0;
} else {
if(crossOp(upper[id-1],upper[id],p) < 0) return 0;
}
return 1;
}
bool get_tangent(P p,int&a,int&b){ // b->a
if(contain(p)) return 0;
a=b=0;
int id = lower_bound(lower.begin(), lower.end(),p) - lower.begin();
binary_search(0,id,p,a,b);
binary_search(id,lower.size(),p,a,b);
id = lower_bound(upper.begin(), upper.end(),p,greater<P>()) - upper.begin();
binary_search((int)lower.size() - 1, (int) lower.size() - 1 + id,p,a,b);
binary_search((int) lower.size() - 1 + id,(int) lower.size() - 1 + upper.size(),p,a,b);
return 1;
}
};
int main(){
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CiNkZWZpbmUgcmVwKGksYSxuKSBmb3IoaW50IGk9KGEpO2k8KG4pO2krKykKI2RlZmluZSBwZXIoaSxhLG4pIGZvcihpbnQgaT0obiktMTtpPj0oYSk7aS0tKQojZGVmaW5lIG1wIG1ha2VfcGFpcgojZGVmaW5lIHBiIHB1c2hfYmFjawoKdHlwZWRlZiBkb3VibGUgZGI7Cgpjb25zdCBkYiBFUFMgPSAxZS04Owpjb25zdCBkYiBJTkYgPSAxZTEwMDsKCmlubGluZSBpbnQgc2lnbihkYiB4LCBkYiBFID0gRVBTKXtyZXR1cm4geDwtRT8tMTp4PkU7fQoKaW5saW5lIGludCBjbXAoZGIgYSxkYiBiLGRiIEUgPSBFUFMpe3JldHVybiBzaWduKGEtYiwgRSk7fQoKc3RydWN0IFB7CglkYiB4LHk7CglQIG9wZXJhdG9yKyhQIG8pe3JldHVybiB7eCtvLngseStvLnl9O30KCVAgb3BlcmF0b3ItKFAgbyl7cmV0dXJuIHt4LW8ueCx5LW8ueX07fQoJUCBvcGVyYXRvci0oKXsgcmV0dXJuIHsteCwteX07IH0KCWRiIGRldChQIG8pe3JldHVybiB4Km8ueS15Km8ueDt9CglkYiBkb3QoUCBvKXtyZXR1cm4geCpvLngreSpvLnk7fQogICAgUCBvcGVyYXRvciooZGIgZCkgeyByZXR1cm4ge3ggKiBkLCB5ICogZH07IH0KICAgIFAgb3BlcmF0b3IvKGRiIGQpIHsgcmV0dXJuIHt4IC8gZCwgeSAvIGR9OyB9CgoJYm9vbCBvcGVyYXRvcjwoUCBvKSBjb25zdCB7IHJldHVybiBjbXAoeCxvLngpICE9IDA/IGNtcCh4LG8ueCkgPT0gLTEgOiBjbXAoeSxvLnkpID09IC0xOyB9Cglib29sIG9wZXJhdG9yPihQIG8pIGNvbnN0IHsgcmV0dXJuIGNtcCh4LG8ueCkgIT0gMD8gY21wKHgsby54KSA9PSAxIDogY21wKHksby55KSA9PSAxOyB9CgoJYm9vbCBvcGVyYXRvcj09KFAgbyl7IHJldHVybiBjbXAoeCxvLngpID09IDAgJiYgY21wKHksby55KSA9PSAwOyB9CgoJdm9pZCByZWFkKCl7CgkJc2NhbmYoIiVsZiVsZiIsJngsJnkpOwoJfQogICAgZGIgYWJzKCkgeyByZXR1cm4gc3FydChhYnMyKCkpO30KICAgIGRiIGFiczIoKSB7IHJldHVybiB4ICogeCArIHkgKiB5OyB9CiAgICBQIHJvdDkwKCkgeyByZXR1cm4gey15LHh9O30KICAgIFAgdW5pdCgpIHsgcmV0dXJuICp0aGlzL2FicygpOyB9Cn1PID0gKFApezAsMH07CgojZGVmaW5lIGNyb3NzKHAxLHAyLHAzKSAoKHAyLngtcDEueCkqKHAzLnktcDEueSktKHAzLngtcDEueCkqKHAyLnktcDEueSkpCiNkZWZpbmUgY3Jvc3NPcChwMSxwMixwMykgc2lnbihjcm9zcyhwMSxwMixwMykpCiAKUCBpc0xMKFAgcDEsIFAgcDIsIFAgcTEsIFAgcTIpIHsKICAgIGRiIGExID0gY3Jvc3MocTEsIHEyLCBwMSksIGEyID0gLWNyb3NzKHExLCBxMiwgcDIpOwogICAgcmV0dXJuIChwMSAqIGEyICsgcDIgKiBhMSkgLyAoYTEgKyBhMik7Cn0KCnZlY3RvcjxQPiBjb252ZXhIdWxsKHZlY3RvcjxQPiBwcykgewogICAgaW50IG4gPSBwcy5zaXplKCk7IGlmKG4gPD0gMSkgcmV0dXJuIHBzOwogICAgc29ydChwcy5iZWdpbigpLCBwcy5lbmQoKSk7CiAgICB2ZWN0b3I8UD4gcXMobiAqIDIpOyBpbnQgayA9IDA7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IG47IHFzW2srK10gPSBwc1tpKytdKSAKICAgICAgICB3aGlsZSAoayA+IDEgJiYgY3Jvc3NPcChxc1trIC0gMl0sIHFzW2sgLSAxXSwgcHNbaV0pIDw9IDApIC0tazsKICAgIGZvciAoaW50IGkgPSBuIC0gMiwgdCA9IGs7IGkgPj0gMDsgcXNbaysrXSA9IHBzW2ktLV0pCiAgICAgICAgd2hpbGUgKGsgPiB0ICYmIGNyb3NzT3AocXNbayAtIDJdLCBxc1trIC0gMV0sIHBzW2ldKSA8PSAwKSAtLWs7CiAgICBxcy5yZXNpemUoayAtIDEpOwogICAgcmV0dXJuIHFzOwp9CgpzdHJ1Y3QgQ0h7CglpbnQgbjsKCgl2ZWN0b3I8UD4gcHMsIGxvd2VyLCB1cHBlcjsKCglQIG9wZXJhdG9yW10oaW50IGkpe3JldHVybiBwc1tpXTt9CgoJaW50IGZpbmQodmVjdG9yPFA+JnZlYywgUCBkaXIpewoJCWludCBsPTAscj12ZWMuc2l6ZSgpOwoJCXdoaWxlKGwrNTxyKXsKCQkJaW50IEwgPSAobCoyK3IpLzMsIFIgPSAobCtyKjIpLzM7CgkJCWlmKHZlY1tMXS5kb3QoZGlyKSA+IHZlY1tSXS5kb3QoZGlyKSkKCQkJCXI9UjsKCQkJZWxzZQoJCQkJbD1MOwoJCX0KCQlpbnQgcmV0ID0gbDsgcmVwKGssbCsxLHIpIGlmKHZlY1trXS5kb3QoZGlyKSA+IHZlY1tyZXRdLmRvdChkaXIpKSByZXQgPSBrOwoJCXJldHVybiByZXQ7Cgl9CgoJLyoKCXBzWzBdIG11c3QgYmUgdGhlIHNtYWxsZXN0IG9uZSEKCSovCgoJdm9pZCBpbml0KHZlY3RvcjxQPiBfcHMpewoJCXBzID0gX3BzOyBuID0gcHMuc2l6ZSgpOwoKCQlyb3RhdGUocHMuYmVnaW4oKSxtaW5fZWxlbWVudChwcy5iZWdpbigpLCBwcy5lbmQoKSkscHMuZW5kKCkpOwoKCQlpbnQgYXQgPSBtYXhfZWxlbWVudChwcy5iZWdpbigpLCBwcy5lbmQoKSkgLSBwcy5iZWdpbigpOwoKCQlsb3dlciA9IHZlY3RvcjxQPihwcy5iZWdpbigpLHBzLmJlZ2luKCkgKyBhdCArIDEpOwoKCQl1cHBlciA9IHZlY3RvcjxQPihwcy5iZWdpbigpK2F0LHBzLmVuZCgpKTsgdXBwZXIucGIocHNbMF0pOwoJfQoKCWludCBmaW5kRmFyZXN0KFAgZGlyKXsKCQlpZihkaXIueSA+IDAgfHwgZGlyLnk9PTAgJiYgZGlyLnggPiAwKXsKCQkJcmV0dXJuICggKGludClsb3dlci5zaXplKCkgLTEgKyBmaW5kKHVwcGVyLGRpcikpICUgbjsKCQl9IGVsc2UgewoJCQlyZXR1cm4gZmluZChsb3dlcixkaXIpOwoJCX0KCX0KCglQIGdldChpbnQgbCxpbnQgcixQIHAxLFAgcDIpewoJCWludCBzbCA9IGNyb3NzT3AocDEscDIscHNbbCVuXSk7CgkJd2hpbGUobCsxPHIpewoJCQlpbnQgbSA9IChsK3IpPj4xOwoJCQlpZihjcm9zc09wKHAxLHAyLHBzW20lbl0pID09IHNsKSAKCQkJCWwgPSBtOwoJCQllbHNlCgkJCQlyID0gbTsKCQl9CgoJCXJldHVybiBpc0xMKHAxLHAyLHBzW2wlbl0scHNbKGwrMSklbl0pOwoJfQoKCXZlY3RvcjxQPiBnZXRJUyhQIHAxLFAgcDIpewoJCWludCBYID0gZmluZEZhcmVzdCgocDItcDEpLnJvdDkwKCkpOwoJCWludCBZID0gZmluZEZhcmVzdCgocDEtcDIpLnJvdDkwKCkpOwoJCWlmKFggPiBZKSBzd2FwKFgsWSk7CgkJaWYoY3Jvc3NPcChwMSxwMixwc1tYXSkgKiBjcm9zc09wKHAxLHAyLHBzW1ldKSA8IDApewoJCQlyZXR1cm4ge2dldChYLFkscDEscDIpLGdldChZLFgrbixwMSxwMil9OwoJCX0gZWxzZSB7CgkJCXJldHVybiB7fTsKCQl9Cgl9CgoJdm9pZCB1cGRhdGVfdGFuZ2VudChQIHAsIGludCBpZCwgaW50JmEsaW50JmIpewoJCWlmKGNyb3NzT3AocCxwc1thXSxwc1tpZF0pID4gMCkgYSA9IGlkOwoJCWlmKGNyb3NzT3AocCxwc1tiXSxwc1tpZF0pIDwgMCkgYiA9IGlkOwoJfQoKCXZvaWQgYmluYXJ5X3NlYXJjaChpbnQgbCxpbnQgcixQIHAsaW50JmEsaW50JmIpewoJCWlmKGw9PXIpIHJldHVybjsKCQl1cGRhdGVfdGFuZ2VudChwLGwlbixhLGIpOwoJCWludCBzbCA9IGNyb3NzT3AocCxwc1tsJW5dLHBzWyhsKzEpJW5dKTsKCQl3aGlsZShsKzE8cil7CgkJCWludCBtID0gbCtyPj4xOwoJCQlpZihjcm9zc09wKHAscHNbbSVuXSxwc1sobSsxKSVuXSkgPT0gc2wpCgkJCQlsPW07CgkJCWVsc2UKCQkJCXI9bTsKCQl9CgkJdXBkYXRlX3RhbmdlbnQocCxyJW4sYSxiKTsKCX0KCglib29sIGNvbnRhaW4oUCBwKXsKCQlpZihwLnggPCBsb3dlclswXS54IHx8IHAueCA+IGxvd2VyLmJhY2soKS54KSByZXR1cm4gMDsKCQlpbnQgaWQgPSBsb3dlcl9ib3VuZChsb3dlci5iZWdpbigpLCBsb3dlci5lbmQoKSwoUCl7cC54LC1JTkZ9KSAtIGxvd2VyLmJlZ2luKCk7CgkJaWYobG93ZXJbaWRdLnggPT0gcC54KXsgCgkJCWlmKGxvd2VyW2lkXS55ID4gcC55KSByZXR1cm4gMDsJCgkJfSBlbHNlIHsgCgkJCWlmKGNyb3NzT3AobG93ZXJbaWQtMV0sbG93ZXJbaWRdLHApIDwgMCkgcmV0dXJuIDA7IAoJCX0KCQlpZCA9IGxvd2VyX2JvdW5kKHVwcGVyLmJlZ2luKCksIHVwcGVyLmVuZCgpLChQKXtwLngsSU5GfSxncmVhdGVyPFA+KCkpIC0gdXBwZXIuYmVnaW4oKTsKCQlpZih1cHBlcltpZF0ueCA9PSBwLngpewoJCQlpZih1cHBlcltpZF0ueSA8IHAueSkgcmV0dXJuIDA7CgkJfSBlbHNlIHsKCQkJaWYoY3Jvc3NPcCh1cHBlcltpZC0xXSx1cHBlcltpZF0scCkgPCAwKSByZXR1cm4gMDsKCQl9CgkJcmV0dXJuIDE7Cgl9CgoJYm9vbCBnZXRfdGFuZ2VudChQIHAsaW50JmEsaW50JmIpeyAvLyBiLT5hCgkJaWYoY29udGFpbihwKSkgcmV0dXJuIDA7CgkJYT1iPTA7CgkJaW50IGlkID0gbG93ZXJfYm91bmQobG93ZXIuYmVnaW4oKSwgbG93ZXIuZW5kKCkscCkgLSBsb3dlci5iZWdpbigpOwoJCWJpbmFyeV9zZWFyY2goMCxpZCxwLGEsYik7CgkJYmluYXJ5X3NlYXJjaChpZCxsb3dlci5zaXplKCkscCxhLGIpOwoJCWlkID0gbG93ZXJfYm91bmQodXBwZXIuYmVnaW4oKSwgdXBwZXIuZW5kKCkscCxncmVhdGVyPFA+KCkpIC0gdXBwZXIuYmVnaW4oKTsKCQliaW5hcnlfc2VhcmNoKChpbnQpbG93ZXIuc2l6ZSgpIC0gMSwgKGludCkgbG93ZXIuc2l6ZSgpIC0gMSArIGlkLHAsYSxiKTsKCQliaW5hcnlfc2VhcmNoKChpbnQpIGxvd2VyLnNpemUoKSAtIDEgKyBpZCwoaW50KSBsb3dlci5zaXplKCkgLSAxICsgdXBwZXIuc2l6ZSgpLHAsYSxiKTsKCQlyZXR1cm4gMTsKCX0KfTsKCmludCBtYWluKCl7CglyZXR1cm4gMDsKfQ==