#include using namespace std; namespace arithmetic { template class Addition { public: template T operator+(const V& v) const { return T(static_cast(*this)) += v; } }; template class Subtraction { public: template T operator-(const V& v) const { return T(static_cast(*this)) -= v; } }; template class Multiplication { public: template T operator*(const V& v) const { return T(static_cast(*this)) *= v; } }; template class Division { public: template T operator/(const V& v) const { return T(static_cast(*this)) /= v; } }; template class Modulus { public: template T operator%(const V& v) const { return T(static_cast(*this)) %= v; } }; } template class IndivisibleArithmetic : public arithmetic::Addition, public arithmetic::Subtraction, public arithmetic::Multiplication {}; template class Arithmetic : public IndivisibleArithmetic, public arithmetic::Division {}; template class Ordered { public: template bool operator==(const V& v) const { return !(static_cast(v) < static_cast(*this) || static_cast(*this) < static_cast(v)); } template bool operator!=(const V& v) const { return static_cast(v) < static_cast(*this) || static_cast(*this) < static_cast(v); } template bool operator>(const V& v) const { return static_cast(v) < static_cast(*this); } template bool operator<=(const V& v) const { return !(static_cast(v) < static_cast(*this)); } template bool operator>=(const V& v) const { return !(static_cast(*this) < static_cast(v)); } }; template inline T gcd(T a, T b) { return __gcd(a, b); } template inline T lcm(T a, T b) { return a / gcd(a, b) * b; } template inline T floor(T a, T b) { return floor(a / b) * b <= a ? floor(a / b) : floor(a / b) - 1; } template inline T ceil(T a, T b) { return floor(a + b - 1, b); } template inline T round(T a, T b) { return floor(a + b / 2); } template inline T mod(T a, T b) { return a - floor(a, b) * b; } template inline T factorial(T n) { return n <= 1 ? 1 : factorial(n - 1) * n; } class Real : public Arithmetic, public arithmetic::Modulus, public Ordered { private: static long double EPS; long double val; operator long double() const { return val; } public: Real() {} Real(long double val) : val(val) {} Real operator-() const { return -val; } template Real operator+=(const T& r) { val += static_cast(r); return *this; } template Real operator-=(const T& r) { val -= static_cast(r); return *this; } template Real operator*=(const T& r) { val *= static_cast(r); return *this; } template Real operator/=(const T& r) { val /= static_cast(r); return *this; } template Real operator%=(const T& r) { return *this = mod(*this, static_cast(r)); } template Real operator-(const T& v) const { return Real(*this) -= v; } template Real operator*(const T& v) const { return Real(*this) *= v; } template Real operator/(const T& v) const { return Real(*this) /= v; } template bool operator<(const T r) const { return val < static_cast(r) - EPS; } Real abs() const { return std::abs(val); } Real sqrt() const { return std::sqrt(val); } long double toLongDouble() const { return val; } }; long double Real::EPS = 1e-10; inline ostream& operator<<(ostream& os, const Real& a) { os << fixed << setprecision(15) << a.toLongDouble(); return os; } inline istream& operator>>(istream& is, Real& a) { long double n; is >> n; a = n; return is; } Real floor(const Real& r) { return floor(r.toLongDouble()); } class Point : public Arithmetic, public Ordered { public: Real x, y; Point() {} Point(const Real& x) : x(x), y(0) {} Point(const Real& x, const Real& y) : x(x), y(y) {} Point operator+=(const Point& p) { x += p.x; y += p.y; return *this; } Point operator-=(const Point& p) { x -= p.x; y -= p.y; return *this; } Point operator*=(const Point& p) { Real xx = x * p.x - y * p.y; y = x * p.y + y * p.x; x = xx; return *this; } Point operator*=(const Real& r) { x *= r; y *= r; return *this; } Point operator/=(const Point& p) { Real nrm = p.norm(); Real xx = (x * p.x + y * p.y) / nrm; y = (y * p.x - x * p.y) / nrm; x = xx; return *this; } Point operator/=(const Real& r) { x /= r; y /= r; return *this; } bool operator<(const Point& p) const { return (x == p.x) ? y < p.y : x < p.x; } Real norm() const { return x * x + y * y; } Real abs() const { return norm().sqrt(); } Point conj() const { return Point(x, -y); } }; inline Point operator*(const Real& real, const Point& point) { return point * real; } inline Point operator/(const Real& real, const Point& point) { return point / real; } inline ostream& operator<<(ostream& os, const Point& point) { os << point.x << " " << point.y; return os; } inline istream& operator>>(istream& is, Point& point) { Real x, y; is >> x >> y; point = Point(x, y); return is; } class Line { public: Point a, b; Line() {} Line (const Point& a, const Point& b) : a(a), b(b) {} bool operator==(const Line& line) const { return ((line.vec() / vec()).y == 0) && (((line.a - a) / vec()).y == 0); } Point vec() const { return b - a; } }; inline ostream& operator<<(ostream& os, const Line& line) { os << line.a << " " << line.b; return os; } inline istream& operator>>(istream& is, Line& line) { Point a, b; is >> a >> b; line = Line(a, b); return is; } class Segment : public Line, public Ordered { public: Segment() {} Segment (const Point& a, const Point& b) : Line(a, b) {} bool operator<(const Segment& segment) const { return a == segment.a ? b < segment.b : a < segment.a; } }; enum CCW{LEFT = 1, RIGHT = 2, BACK = 4, FRONT = 8, ON = 16}; int ccw(const Point& a, const Point& b, const Point& c) { Point p = (c - a) / (b - a); if (p.y > 0) return LEFT; if (p.y < 0) return RIGHT; if (p.x < 0) return BACK; if (p.x > 1) return FRONT; return ON; } int ccw(const Segment& segment, const Point& point) { return ccw(segment.a, segment.b, point); } int ccw(const Line& line, const Point& point) { int res = ccw(line.a, line.b, point); if (res == BACK || res == FRONT) res = ON; return res; } class Polygon : public vector { public: Polygon() {} Polygon(int n) : vector(n) {} Polygon(const initializer_list& p) : vector(p) {} Polygon(const vector& p) : vector(p) {} vector getSides() const { if (size() <= 1u) return {}; vector res; Point pre = back(); for (const auto& point : *this) { res.emplace_back(pre, point); pre = point; } return res; } vector> getCorners() const { if (size() <= 2u) return {}; vector> res; Point pre1 = *(end() - 2), pre2 = back(); for (const auto& point : *this) { res.emplace_back(array({{pre1, pre2, point}})); pre1 = pre2; pre2 = point; } return res; } Point& operator[](int i) { return vector::operator[](mod(i, (int)size())); } const Point& operator[](int i) const { return vector::operator[](mod(i, (int)size())); } template bool cover(const Point& point) const { bool res = false; for (auto& side : getSides()) { if (ccw(side, point) == ON) return strict ? false : true; if (side.a.y > side.b.y) std::swap(side.a, side.b); if (side.a.y <= point.y && point.y < side.b.y && ((side.b - point) / (side.a - point)).y > 0) res = !res; } return res; } }; template inline bool intersect(const Line& line1, const Line& line2) { if (strict) return (line1.vec() / line2.vec()).y != 0; return ((line1.vec() / line2.vec()).y != 0) || (line1 == line2); } template inline bool intersect(const Line& line, const Segment& segment) { Point p1 = (segment.a - line.a) / line.vec(), p2 = (segment.b - line.a) / line.vec(); if (strict) return p1.y * p2.y < 0; return p1.y * p2.y <= 0; } template inline bool intersect(const Segment& segment, const Line& line) { return intersect(line, segment); } template inline bool intersect(const Segment& segment1, const Segment& segment2) { int ccw1 = ccw(segment1, segment2.a) | ccw(segment1, segment2.b); int ccw2 = ccw(segment2, segment1.a) | ccw(segment2, segment1.b); if (strict) return (ccw1 & ccw2) == (LEFT | RIGHT); return ((ccw1 & ccw2) == (LEFT | RIGHT)) || ((ccw1 | ccw2) & ON); } inline Point crossPoint(const Line& line1, const Line& line2) { return line1.a + line1.vec() * ((line2.a - line1.a) / line2.vec()).y / (line1.vec() / line2.vec()).y; } template class ConvexPolygon : public Polygon { public: ConvexPolygon() {} ConvexPolygon(int n) : Polygon(n) {} ConvexPolygon(vector points) { int flag = ~(strict ? LEFT : LEFT | FRONT); sort(points.begin(), points.end()); for (int i = 0; i < (int)points.size(); emplace_back(points[i++])) { while (size() > 1u && ccw(*(end() - 2), back(), points[i]) & flag) pop_back(); } for (int i = points.size() - 2, r = size(); i >= 0; emplace_back(points[i--])) { while ((int)size() > r && ccw(*(end() - 2), back(), points[i]) & flag) pop_back(); } pop_back(); } Real diameter() { auto sides = getSides(); int i = min_element(sides.begin(), sides.end()) - sides.begin(); int j = max_element(sides.begin(), sides.end()) - sides.begin(); sides.insert(sides.end(), sides.begin(), sides.end()); Real res = 0; for (int k = 0; k < 2 * size(); ++k) { if ((sides[i].vec() / sides[j].vec()).y >= 0) ++i; else ++j; res = max(res, (sides[i].a - sides[j].a).abs()); } return res; } ConvexPolygon cut(const Line& line) { ConvexPolygon res; auto sides = getSides(); for (const auto& side : sides) { if (ccw(line, side.a) != RIGHT) res.push_back(side.a); if (intersect(line, side)) res.push_back(crossPoint(line, side)); } return res; } }; int main() { vector p(5); for (auto& i : p) cin >> i; cout << (ConvexPolygon<>(p).size() == 5 ? "YES" : "NO") << endl; }