#include namespace zawa { using i16 = std::int16_t; using i32 = std::int32_t; using i64 = std::int64_t; using i128 = __int128_t; using u8 = std::uint8_t; using u16 = std::uint16_t; using u32 = std::uint32_t; using u64 = std::uint64_t; using usize = std::size_t; } // namespace zawa namespace zawa { void SetFastIO() { std::cin.tie(nullptr)->sync_with_stdio(false); } void SetPrecision(u32 dig) { std::cout << std::fixed << std::setprecision(dig); } } // namespace zawa namespace zawa { namespace geometryZ2 { using Zahlen = i64; namespace internal { constexpr i32 positive{1}; constexpr i32 zero{0}; constexpr i32 negative{-1}; } // namespace internal constexpr i32 Sign(Zahlen value) { if (value < 0) return internal::negative; if (value > 0) return internal::positive; return internal::zero; } constexpr bool Positive(Zahlen value) { return Sign(value) == internal::positive; } constexpr bool Zero(Zahlen value) { return Sign(value) == internal::zero; } constexpr bool Negative(Zahlen value) { return Sign(value) == internal::negative; } constexpr Zahlen Abs(Zahlen value) { return (value > 0 ? value : -value); } constexpr Zahlen Square(Zahlen value) { return value * value; } } // namespace geometryZ2 } // namespace zawa namespace zawa { namespace geometryZ2 { class Point { private: Zahlen x_{}, y_{}; static constexpr i32 origin{0}; static constexpr i32 firstQuadrant{1}; static constexpr i32 secondQuadrant{2}; static constexpr i32 thirdQuadrant{-2}; static constexpr i32 forthQuadrant{-1}; public: /* constructor */ Point() = default; Point(const Point& p) : x_{p.x()}, y_{p.y()} {} Point(Zahlen x, Zahlen y) : x_{x}, y_{y} {} /* getter setter */ Zahlen& x() { return x_; } const Zahlen& x() const { return x_; } Zahlen& y() { return y_; } const Zahlen& y() const { return y_; } /* operator */ 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; } friend Point operator+(const Point& p0, const Point& p1) { return Point{p0} += p1; } Point& operator-=(const Point& p) { x() -= p.x(); y() -= p.y(); return *this; } friend Point operator-(const Point& p0, const Point& p1) { return Point{p0} -= p1; } Point& operator*=(Zahlen k) { x() *= k; y() *= k; return *this; } friend Point operator*(const Point& p, Zahlen k) { return Point{p} *= k; } friend Point operator*(Zahlen k, const Point& p) { return Point{p} *= k; } Point& operator/=(Zahlen k) { assert(k); assert(x() % k == 0); assert(y() % k == 0); x() /= k; y() /= k; return *this; } friend Point operator/(const Point& p, Zahlen k) { return Point{p} /= k; } friend bool operator==(const Point& p0, const Point& p1) { return p0.x() == p1.x() and p0.y() == p1.y(); } friend bool operator!=(const Point& p0, const Point& p1) { return p0.x() != p1.x() or p0.y() != p1.y(); } friend bool operator<(const Point& p0, const Point& p1) { if (p0.x() != p1.x()) return p0.x() < p1.x(); else return p0.y() < p1.y(); } friend bool operator<=(const Point& p0, const Point& p1) { return (p0 < p1) or (p0 == p1); } friend bool operator>(const Point& p0, const Point& p1) { if (p0.x() != p1.x()) return p0.x() > p1.x(); else return p0.y() > p1.y(); } friend bool operator>=(const Point& p0, const Point& p1) { return (p0 > p1) or (p0 == p1); } friend std::istream& operator>>(std::istream& is, Point& p) { is >> p.x() >> p.y(); return is; } friend std::ostream& operator<<(std::ostream& os, const Point& p) { os << '(' << p.x() << ',' << p.y() << ')'; return os; } /* member function */ Zahlen normSquare() const { return Square(x()) + Square(y()); } i32 area() const { if (x_ == 0 and y_ == 0) return origin; if (x_ <= 0 and y_ < 0) return thirdQuadrant; if (x_ > 0 and y_ <= 0) return forthQuadrant; if (x_ >= 0 and y_ > 0) return firstQuadrant; return secondQuadrant; } /* static member */ static bool ArgComp(const Point& p0, const Point& p1) { if (p0.area() != p1.area()) return p0.area() < p1.area(); Zahlen cross{Cross(p0, p1)}; return (!Zero(cross) ? Positive(cross) : p0.normSquare() < p1.normSquare()); } /* friend function */ friend Zahlen Dot(const Point& p0, const Point& p1) { return p0.x() * p1.x() + p0.y() * p1.y(); } friend Zahlen Cross(const Point& p0, const Point& p1) { return p0.x() * p1.y() - p0.y() * p1.x(); } }; using Vector = Point; } // namespace geometryZ2 } // namespace zawa namespace zawa { namespace geometryZ2 { enum RELATION { // p0 -> p1 -> p2の順で直線上に並んでいる ONLINE_FRONT = -2, // (p1 - p0) -> (p2 - p0)が時計回りになっている CLOCKWISE = -1, // p0 -> p2 -> p1の順で直線上に並んでいる ON_SEGMENT = 0, // (p1 - p0) -> (p2 - p0)が反時計回りになっている COUNTER_CLOCKWISE = +1, // p2 -> p0 -> p1、またはp1 -> p0 -> p2の順で直線上に並んでいる ONLINE_BACK = +2 }; RELATION Relation(const Point& p0, const Point& p1, const Point& p2) { Point a{p1 - p0}, b{p2 - p0}; if (Positive(Cross(a, b))) return COUNTER_CLOCKWISE; if (Negative(Cross(a, b))) return CLOCKWISE; if (Negative(Dot(a, b))) return ONLINE_BACK; if (a.normSquare() < b.normSquare()) return ONLINE_FRONT; return ON_SEGMENT; }; } // namespace geometryZ2 } // namespace zawa #include namespace zawa { namespace geometryZ2 { class Polygon { private: std::vector data_; public: usize size() const { return data_.size(); } /* constructor */ Polygon() = default; Polygon(const Polygon& polygon) : data_{polygon.data_} {} Polygon(const std::vector& data) : data_{data} {} Polygon(usize n) : data_{n} { assert(n >= static_cast(3)); } /* operator */ Polygon& operator=(const Polygon& polygon) { data_ = polygon.data_; return *this; } Point& operator[](usize i) { assert(i < size()); return data_[i]; } const Point& operator[](usize i) const { assert(i < size()); return data_[i]; } friend std::istream& operator>>(std::istream& is, Polygon& polygon) { for (size_t i{} ; i < polygon.size() ; i++) { is >> polygon[i]; } return is; } friend std::ostream& operator<<(std::ostream& os, const Polygon& polygon) { for (usize i{} ; i < polygon.size() ; i++) { std::cout << polygon[i] << (i + 1 == polygon.size() ? "" : " "); } return os; } /* member function */ void reserve(usize n) { data_.reserve(n); } void pushBack(const Point& p) { data_.push_back(p); } void emplaceBack(Zahlen x, Zahlen y) { data_.emplace_back(x, y); } template void insert(usize n, RandomAccessIterator first, RandomAccessIterator last) { assert(n <= size()); data_.insert(std::next(data_.begin(), n), first, last); } void orderRotate(usize i) { assert(i < size()); std::rotate(data_.begin(), data_.begin() + i, data_.end()); } template void normalForm(const F& func) { auto index{std::distance(data_.begin(), std::min_element(data_.begin(), data_.end(), func))}; orderRotate(index); } void normalForm() { auto index{std::distance(data_.begin(), std::min_element(data_.begin(), data_.end()))}; orderRotate(index); } template Polygon normalFormed(const F& func = [](const Point& a, const Point& b) -> bool { return a < b; }) const { Polygon res{*this}; res.normalForm(func); return res; } Polygon normalFormed() { Polygon res{*this}; res.normalForm(); return res; } bool isConvex() const { assert(size() >= static_cast(3)); for (usize i{} ; i < size() ; i++) { if (Relation(data_[i], data_[i+1==size()?0:i+1], data_[i+2>=size()?i+2-size():i+2]) == CLOCKWISE) { return false; } } return true; } Zahlen areaTwice() const { assert(size() >= static_cast(3)); Zahlen res{}; for (usize i{1} ; i < size() ; i++) { res += Cross(data_[i] - data_[0], data_[i+1==size()?0:i+1] - data_[0]); } return res; } Polygon subtriangle(usize i, usize j, usize k) const { assert(i < size()); assert(j < size()); assert(k < size()); return Polygon{std::vector{ data_[i], data_[j], data_[k] }}; } }; } } // namespace zawa using namespace zawa; using namespace geometryZ2; int main() { SetFastIO(); Point p[3]; for (int i{} ; i < 3 ; i++) { std::cin >> p[i]; } std::vector q(3); auto dfs{[&](auto dfs, int i) -> Zahlen { if (i == 3) { Polygon cur{q}; return std::abs(cur.areaTwice()); } Zahlen res{}; q[i] = p[i] + Point{ 1, 0 }; res = std::max(res, dfs(dfs, i + 1)); q[i] = p[i] + Point{ -1, 0 }; res = std::max(res, dfs(dfs, i + 1)); q[i] = p[i] + Point{ 0, 1 }; res = std::max(res, dfs(dfs, i + 1)); q[i] = p[i] + Point{ 0, -1 }; res = std::max(res, dfs(dfs, i + 1)); return res; }}; std::cout << (double)dfs(dfs, 0) / 2.0 << '\n'; }