template <class T> int sgn(T x) { return (x > 0) - (x < 0); }
template <class T> struct Point {
T x, y;
Point() : x(0), y(0) {}
Point(const T& x, const T& y) : x(x), y(y) {}
friend std::ostream& operator<<(std::ostream& out, const Point& p) { return out << "(" << p.x << "," << p.y << ")"; }
friend std::istream& operator>>(std::istream& in, Point& p) { return in >> p.x >> p.y; }
friend bool operator==(const Point& a, const Point& b) { return tie(a.x, a.y) == tie(b.x, b.y); }
friend bool operator!=(const Point& a, const Point& b) { return tie(a.x, a.y) != tie(b.x, b.y); }
friend bool operator<(const Point& a, const Point& b) { return tie(a.x, a.y) < tie(b.x, b.y); }
Point operator+(const Point& p) const { return Point(x + p.x, y + p.y); }
Point operator-(const Point& p) const { return Point(x - p.x, y - p.y); }
Point operator*(const T& d) const { return Point(x * d, y * d); }
Point operator/(const T& d) const { return Point(x / d, y / d); }
T dot(const Point& p) const { return x * p.x + y * p.y; }
T cross(const Point& p) const { return x * p.y - y *p.x; }
T cross(const Point& a, const Point& b) const { return (a - *this).cross(b - *this); }
T dist2() const { return x * x + y * y; }
double dist() const { return sqrt((double)dist2()); }
double angle() const { return atan2(y, x); } // [-pi, pi] to x-axis
Point unit() const { return *this / dist(); } // unit vector
Point perp() const { return P(-y, x); } // rotates +90 degrees
Point normal() const { return perp().unit(); }
};