#include <cmath>
#include <iostream>

int main() {
    double x1,y1,x2,y2,x3,y3,x4,y4;
    const double EPS=1e-9;
    std::cout << "Введите координаты концов двух отрезков: ";
    if (!(std::cin>>x1>>y1>>x2>>y2>>x3>>y3>>x4>>y4) ||
        (std::fabs(x1-x2)<EPS && std::fabs(y1-y2)<EPS) ||
        (std::fabs(x3-x4)<EPS && std::fabs(y3-y4)<EPS)) {
        std::cout << "Ошибка: отрезки должны быть невырожденными.\n"; return 0;
    }
    double c1=(x2-x1)*(y3-y1)-(y2-y1)*(x3-x1);
    double c2=(x2-x1)*(y4-y1)-(y2-y1)*(x4-x1);
    double c3=(x4-x3)*(y1-y3)-(y4-y3)*(x1-x3);
    double c4=(x4-x3)*(y2-y3)-(y4-y3)*(x2-x3);
    bool intersect=((c1>EPS && c2<-EPS) || (c1<-EPS && c2>EPS)) &&
                   ((c3>EPS && c4<-EPS) || (c3<-EPS && c4>EPS));
    double minx1=x1, maxx1=x2, miny1=y1, maxy1=y2;
    double minx2=x3, maxx2=x4, miny2=y3, maxy2=y4;
    if (minx1>maxx1) { double t=minx1; minx1=maxx1; maxx1=t; }
    if (miny1>maxy1) { double t=miny1; miny1=maxy1; maxy1=t; }
    if (minx2>maxx2) { double t=minx2; minx2=maxx2; maxx2=t; }
    if (miny2>maxy2) { double t=miny2; miny2=maxy2; maxy2=t; }
    if (std::fabs(c1)<EPS && x3>=minx1-EPS && x3<=maxx1+EPS && y3>=miny1-EPS && y3<=maxy1+EPS) intersect=true;
    if (std::fabs(c2)<EPS && x4>=minx1-EPS && x4<=maxx1+EPS && y4>=miny1-EPS && y4<=maxy1+EPS) intersect=true;
    if (std::fabs(c3)<EPS && x1>=minx2-EPS && x1<=maxx2+EPS && y1>=miny2-EPS && y1<=maxy2+EPS) intersect=true;
    if (std::fabs(c4)<EPS && x2>=minx2-EPS && x2<=maxx2+EPS && y2>=miny2-EPS && y2<=maxy2+EPS) intersect=true;
    if (intersect) std::cout << "Отрезки пересекаются.\n";
    else std::cout << "Отрезки не пересекаются.\n";
    return 0;
}
