#include <bits/stdc++.h>
using namespace std;
int dbl_cmp(double d1, double d2) {
  if (fabs(d1 - d2) <= 1e-9) {
    return 0;
  }
  return d1 < d2 ? -1 : 1;
}
bool line_intersect(complex<double> &a, complex<double> &b, complex<double> &p,
                    complex<double> &q, complex<double> &ret) {
  double d1 = ((conj(((p) - (a))) * (((b) - (a)))).imag());
  double d2 = ((conj(((q) - (a))) * (((b) - (a)))).imag());
  ret = (d1 * q - d2 * p) / (d1 - d2);
  return dbl_cmp(d1, d2) != 0;
}
int main() {
  int n;
  scanf("%d", &n);
  complex<double> p[1111];
  bool dir = 0;
  for (int i = 0; i < n; i++) {
    int x, y;
    scanf("%d %d", &x, &y);
    p[i] = complex<double>(x, y);
  }
  if (dbl_cmp(p[0].real(), p[1].real()) > 0) {
    dir = 1;
    swap(p[0], p[1]);
    reverse(p + 2, p + n);
  }
  pair<double, double> v[1111];
  for (int i = 0; i < n; i++) {
    v[i] = pair<double, double>(p[0].real(), p[1].real());
  }
  for (int i = 1; i < n; i++) {
    for (int j = 2; j < n; j++) {
      if (j == i || j == i + 1) {
        continue;
      }
      complex<double> p1, p2;
      if (!line_intersect(p[0], p[1], p[j], p[(i + 0) % n], p1)) {
        if (dbl_cmp(p[j].real(), p[(i + 0) % n].real()) < 0) {
          p1 = complex<double>(+1e9, p[0].imag());
        } else {
          p1 = complex<double>(-1e9, p[0].imag());
        }
      }
      if (!line_intersect(p[0], p[1], p[j], p[(i + 1) % n], p2)) {
        if (dbl_cmp(p[j].real(), p[(i + 1) % n].real()) < 0) {
          p2 = complex<double>(+1e9, p[0].imag());
        } else {
          p2 = complex<double>(-1e9, p[0].imag());
        }
      }
      bool op1 =
          dbl_cmp((sqrt((((p[(i + 0) % n]) - (p[j]))).real() *
                            (((p[(i + 0) % n]) - (p[j]))).real() +
                        (((p[(i + 0) % n]) - (p[j]))).imag() *
                            (((p[(i + 0) % n]) - (p[j]))).imag())) +
                      (sqrt((((p1) - (p[(i + 0) % n]))).real() *
                                (((p1) - (p[(i + 0) % n]))).real() +
                            (((p1) - (p[(i + 0) % n]))).imag() *
                                (((p1) - (p[(i + 0) % n]))).imag())),
                  (sqrt((((p1) - (p[j]))).real() * (((p1) - (p[j]))).real() +
                        (((p1) - (p[j]))).imag() * (((p1) - (p[j]))).imag())));
      bool op2 =
          dbl_cmp((sqrt((((p[(i + 1) % n]) - (p[j]))).real() *
                            (((p[(i + 1) % n]) - (p[j]))).real() +
                        (((p[(i + 1) % n]) - (p[j]))).imag() *
                            (((p[(i + 1) % n]) - (p[j]))).imag())) +
                      (sqrt((((p2) - (p[(i + 1) % n]))).real() *
                                (((p2) - (p[(i + 1) % n]))).real() +
                            (((p2) - (p[(i + 1) % n]))).imag() *
                                (((p2) - (p[(i + 1) % n]))).imag())),
                  (sqrt((((p2) - (p[j]))).real() * (((p2) - (p[j]))).real() +
                        (((p2) - (p[j]))).imag() * (((p2) - (p[j]))).imag())));
      if (op1 && op2) {
        continue;
      } else if (op1) {
        if ((((conj(((p[(i + 1) % n]) - (p[(i + 0) % n]))) *
               (((p[j]) - (p[(i + 0) % n]))))
                  .imag()) > 1e-9) == dir) {
          continue;
        }
        if (dbl_cmp(p[j].real(), p[(i + 0) % n].real()) < 0) {
          p1 = complex<double>(+1e9, p[0].imag());
        } else {
          p1 = complex<double>(-1e9, p[0].imag());
        }
      } else if (op2) {
        if ((((conj(((p[(i + 1) % n]) - (p[(i + 0) % n]))) *
               (((p[j]) - (p[(i + 0) % n]))))
                  .imag()) > 1e-9) == dir) {
          continue;
        }
        if (dbl_cmp(p[j].real(), p[(i + 1) % n].real()) < 0) {
          p2 = complex<double>(+1e9, p[0].imag());
        } else {
          p2 = complex<double>(-1e9, p[0].imag());
        }
      }
      if (dbl_cmp(p1.real(), p2.real()) > 0) {
        swap(p1, p2);
      }
      pair<double, double> np = pair<double, double>(min(p1.real(), p2.real()),
                                                     max(p1.real(), p2.real()));
      if (i < j) {
        v[j].second = min(v[j].second, p1.real());
      } else {
        v[j].first = max(v[j].first, p2.real());
      }
    }
  }
  double a = min(p[0].real(), p[1].real()), b = max(p[0].real(), p[1].real());
  for (int i = 0; i < n; i++) {
    a = max(a, v[i].first);
    b = min(b, v[i].second);
  }
  char x[100];
  sprintf(x, "%.0lf %.0lf", a - 1e-9 + 0.5, b + 1e-9 - 0.5);
  int s, e;
  sscanf(x, "%d %d", &s, &e);
  printf("%d\n", max(0, e - s + 1));
  return 0;
}
