#include <iostream>
#include <iomanip>
using namespace std;
class Point {
public:
double x, y;
Point() { }
Point(double _x, double _y) {
x = _x;
y = _y;
}
void getData() {
cin >> x >> y;
}
// kiểm tra điểm này có nằm giữa 2 điểm A và B không
bool isMiddle(const Point &A, const Point &B) {
int ok = 0;
ok += (A.x <= x && x <= B.x) || (A.x >= x && x >= B.x);
ok += (A.y <= y && y <= B.y) || (A.y >= y && y >= B.y);
return ok == 2;
}
};
class Line {
private:
// hệ số của đường thẳng ax + by = c
double a, b, c;
public:
Line(const Point &A, const Point &B) {
if (A.x == B.x) {
a = 1;
b = 0;
} else {
a = (B.y - A.y) / (A.x - B.x);
b = 1;
}
c = a * A.x + b * A.y;
}
pair<int, Point> getIntersection(const Line &other) {
// định thức Cramer
double d = a * other.b - b * other.a;
double dx = c * other.b - b * other.c;
double dy = a * other.c - c * other.a;
if (d) {
// 2 đường cắt nhau -> 1 giao điểm
return {1, Point(dx/d, dy/d)};
}
if (dx || dy) {
// 2 đường thẳng song song -> 0 giao điểm
return {0, Point()};
}
// 2 đường trùng nhau -> vô số giao điểm
return {2, Point()};
}
};
int main() {
cout << fixed << setprecision(2);
Point A, B, C, D;
A.getData();
B.getData();
C.getData();
D.getData();
Line m(A, B);
Line n(C, D);
auto [k, E] = m.getIntersection(n);
if (k == 0) {
cout << "NO";
} else if (k == 1) {
if (E.isMiddle(A, B) && E.isMiddle(C, D)) {
cout << E.x << ' ' << E.y;
} else {
cout << "NO";
}
} else {
if (A.x > B.x) {
swap(A, B);
}
if (C.x > D.x) {
swap(C, D);
}
if (A.x > C.x) {
swap(A, C);
swap(B, D);
}
if (B.x < C.x) {
cout << "NO";
} else if (B.x > C.x) {
cout << "MANY";
} else {
cout << B.x << ' ' << B.y;
}
}
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8aW9tYW5pcD4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCmNsYXNzIFBvaW50IHsKcHVibGljOgogIGRvdWJsZSB4LCB5OwogIFBvaW50KCkgeyB9CiAgUG9pbnQoZG91YmxlIF94LCBkb3VibGUgX3kpIHsKICAgIHggPSBfeDsKICAgIHkgPSBfeTsKICB9CiAgdm9pZCBnZXREYXRhKCkgewogICAgY2luID4+IHggPj4geTsKICB9CiAgLy8ga2nhu4NtIHRyYSDEkWnhu4NtIG7DoHkgY8OzIG7hurFtIGdp4buvYSAyIMSRaeG7g20gQSB2w6AgQiBraMO0bmcKICBib29sIGlzTWlkZGxlKGNvbnN0IFBvaW50ICZBLCBjb25zdCBQb2ludCAmQikgewogICAgaW50IG9rID0gMDsKICAgIG9rICs9IChBLnggPD0geCAmJiB4IDw9IEIueCkgfHwgKEEueCA+PSB4ICYmIHggPj0gQi54KTsKICAgIG9rICs9IChBLnkgPD0geSAmJiB5IDw9IEIueSkgfHwgKEEueSA+PSB5ICYmIHkgPj0gQi55KTsKICAgIHJldHVybiBvayA9PSAyOwogIH0KfTsKCmNsYXNzIExpbmUgewpwcml2YXRlOgogIC8vIGjhu4cgc+G7kSBj4bunYSDEkcaw4budbmcgdGjhurNuZyBheCArIGJ5ID0gYwogIGRvdWJsZSBhLCBiLCBjOwpwdWJsaWM6CiAgTGluZShjb25zdCBQb2ludCAmQSwgY29uc3QgUG9pbnQgJkIpIHsKICAgIGlmIChBLnggPT0gQi54KSB7CiAgICAgIGEgPSAxOwogICAgICBiID0gMDsKICAgIH0gZWxzZSB7CiAgICAgIGEgPSAoQi55IC0gQS55KSAvIChBLnggLSBCLngpOwogICAgICBiID0gMTsKICAgIH0KICAgIGMgPSBhICogQS54ICsgYiAqIEEueTsKICB9CiAgcGFpcjxpbnQsIFBvaW50PiBnZXRJbnRlcnNlY3Rpb24oY29uc3QgTGluZSAmb3RoZXIpIHsKICAgIC8vIMSR4buLbmggdGjhu6ljIENyYW1lcgogICAgZG91YmxlIGQgPSBhICogb3RoZXIuYiAtIGIgKiBvdGhlci5hOwogICAgZG91YmxlIGR4ID0gYyAqIG90aGVyLmIgLSBiICogb3RoZXIuYzsKICAgIGRvdWJsZSBkeSA9IGEgKiBvdGhlci5jIC0gYyAqIG90aGVyLmE7CiAgICBpZiAoZCkgewogICAgICAvLyAyIMSRxrDhu51uZyBj4bqvdCBuaGF1IC0+IDEgZ2lhbyDEkWnhu4NtCiAgICAgIHJldHVybiB7MSwgUG9pbnQoZHgvZCwgZHkvZCl9OwogICAgfQogICAgaWYgKGR4IHx8IGR5KSB7CiAgICAgIC8vIDIgxJHGsOG7nW5nIHRo4bqzbmcgc29uZyBzb25nIC0+IDAgZ2lhbyDEkWnhu4NtCiAgICAgIHJldHVybiB7MCwgUG9pbnQoKX07CiAgICB9CiAgICAvLyAyIMSRxrDhu51uZyB0csO5bmcgbmhhdSAtPiB2w7Qgc+G7kSBnaWFvIMSRaeG7g20KICAgIHJldHVybiB7MiwgUG9pbnQoKX07CiAgfQp9OwoKaW50IG1haW4oKSB7CiAgY291dCA8PCBmaXhlZCA8PCBzZXRwcmVjaXNpb24oMik7CiAgUG9pbnQgQSwgQiwgQywgRDsKICBBLmdldERhdGEoKTsKICBCLmdldERhdGEoKTsKICBDLmdldERhdGEoKTsKICBELmdldERhdGEoKTsKICBMaW5lIG0oQSwgQik7CiAgTGluZSBuKEMsIEQpOwogIGF1dG8gW2ssIEVdID0gbS5nZXRJbnRlcnNlY3Rpb24obik7CiAgaWYgKGsgPT0gMCkgewogICAgY291dCA8PCAiTk8iOwogIH0gZWxzZSBpZiAoayA9PSAxKSB7CiAgICBpZiAoRS5pc01pZGRsZShBLCBCKSAmJiBFLmlzTWlkZGxlKEMsIEQpKSB7CiAgICAgIGNvdXQgPDwgRS54IDw8ICcgJyA8PCBFLnk7CiAgICB9IGVsc2UgewogICAgICBjb3V0IDw8ICJOTyI7CiAgICB9CiAgfSBlbHNlIHsKICAgIGlmIChBLnggPiBCLngpIHsKICAgICAgc3dhcChBLCBCKTsKICAgIH0KICAgIGlmIChDLnggPiBELngpIHsKICAgICAgc3dhcChDLCBEKTsKICAgIH0KICAgIGlmIChBLnggPiBDLngpIHsKICAgICAgc3dhcChBLCBDKTsKICAgICAgc3dhcChCLCBEKTsKICAgIH0KICAgIGlmIChCLnggPCBDLngpIHsKICAgICAgY291dCA8PCAiTk8iOwogICAgfSBlbHNlIGlmIChCLnggPiBDLngpIHsKICAgICAgY291dCA8PCAiTUFOWSI7CiAgICB9IGVsc2UgewogICAgICBjb3V0IDw8IEIueCA8PCAnICcgPDwgQi55OwogICAgfQogIH0KfQ==