#include <iostream>
using namespace std;

int main() {
   long long Ax, Ay, Bx, By, Cx, Cy, Dx, Dy;
   scanf("%lld%lld%lld%lld%lld%lld%lld%lld", &Ax, &Ay, &Bx, &By, &Cx, &Cy, &Dx, &Dy);
   long long minX = max(min(Ax, Bx), min(Cx, Dx));
   long long minY = max(min(Ay, By), min(Cy, Dy));
   long long maxX = min(max(Ax, Bx), max(Cx, Dx));
   long long maxY = min(max(Ay, By), max(Cy, Dy));
   if ((minX > maxX) || (minY > maxY)) { // Не пересекаются проекции
       printf("No\n");
   } else {
       if (((Ay - By) * Cx + (Bx - Ax) * Cy == Ay * Bx - Ax * By) && ((Ay - By) * Dx + (Bx - Ax) * Dy == Ay * Bx - Ax * By)) {
           printf("Yes\n"); // На одной прямой
       } else { // координаты пересечения в виде рациональной дроби..
            long long xn = (Ay * Bx - Ax * By) * (Dx - Cx) - (Cy * Dx - Cx * Dy) * (Bx - Ax);
            long long xd = (xn == 0)? 1: (Ay - By) * (Dx - Cx) - (Bx - Ax) * (Cy - Dy);
            long long yn = (Ay * Bx - Ax * By) * (Cy - Dy) - (Cy * Dx - Cx * Dy) * (Ay - By);
            long long yd = (yn == 0)? 1: (Bx - Ax) * (Cy - Dy) - (Ay - By) * (Dx - Cx);
            // ... с положительным знаменателем
            if (xd < 0) {
                xd = -xd; xn = -xn;
            }
            if (yd < 0) {
                yd = -yd; yn = -yn;
            }
            // Попадает на пересечение проекций?
            printf(((minX * xd <= xn) && (xn <= maxX * xd) && (minY * yd <= yn) && (yn <= maxY * yd))? "Yes\n": "No\n");
       }
   }
   return 0;
}