#include <bits/stdc++.h>
using namespace std;
const double pi = atan(1.) * 4.;
const int max_n = 1e5 + 100;
const long long mod = 1e9 + 7;
struct Node {
  int x;
  int y;
};
int mapp[4100][4100];
int xx[2100];
int yy[2100];
void fun(int x1, int y1, int x2, int y2) {
  int m = min(x1, x2);
  int n = max(x1, x2);
  int k = max(y1, y2);
  for (int i = m; i <= n; i++) {
    for (int j = min(y1, y2); j <= k; j++) {
      mapp[i][j] = 1;
    }
  }
}
bool isfun(int x, int y) {
  bool flag1 = false, flag2 = false, flag4 = false, flag3 = false;
  for (int i = x; i >= 0 && !flag1; i--) {
    if (mapp[i][y] == 1 && abs(i - x) > 1) flag1 = true;
  }
  for (int i = x; i <= 2050 && !flag2; i++) {
    if (mapp[i][y] == 1) flag2 = true;
  }
  for (int i = y; i >= 0 && !flag3; i--) {
    if (mapp[x][i] == 1) flag3 = true;
  }
  for (int i = x; i <= 2050 && !flag4; i++) {
    if (mapp[x][i] == 1) flag4 = true;
  }
  return flag1 && flag2 && flag3 && flag4;
}
int go[4][2] = {0, 1, 0, -1, 1, 0, -1, 0};
int maxv = -1;
void bfs() {
  Node node = (Node){0, 0};
  mapp[0][0] = 2;
  queue<Node> que;
  que.push(node);
  int x, y;
  int dx, dy;
  while (!que.empty()) {
    node = que.front();
    que.pop();
    x = node.x;
    y = node.y;
    for (int i = 0; i < 4; i++) {
      dx = x + go[i][0];
      dy = y + go[i][1];
      if (dx < 0 || dy < 0 || dx > maxv || dy > maxv) continue;
      if (mapp[dx][dy] != 0) continue;
      mapp[dx][dy] = 2;
      que.push((Node){dx, dy});
    }
  }
  return;
}
vector<int> vec;
void solve() {
  int n;
  cin >> n;
  int x, y;
  scanf("%d%d", &xx[0], &yy[0]);
  int nn = 2 * n;
  vec.push_back(xx[0]);
  vec.push_back(yy[0]);
  for (int i = 1; i <= n; i++) {
    scanf("%d%d", &xx[i], &yy[i]);
    vec.push_back(xx[i]);
    vec.push_back(yy[i]);
  }
  sort(vec.begin(), vec.end());
  vec.erase(unique(vec.begin(), vec.end()), vec.end());
  xx[0] = lower_bound(vec.begin(), vec.end(), xx[0]) - vec.begin() + 1;
  yy[0] = lower_bound(vec.begin(), vec.end(), yy[0]) - vec.begin() + 1;
  xx[0] *= 2;
  yy[0] *= 2;
  maxv = max(maxv, xx[0]);
  maxv = max(maxv, yy[0]);
  mapp[xx[0]][yy[0]] = 1;
  for (int i = 1; i <= n; i++) {
    xx[i] = lower_bound(vec.begin(), vec.end(), xx[i]) - vec.begin() + 1;
    yy[i] = lower_bound(vec.begin(), vec.end(), yy[i]) - vec.begin() + 1;
    xx[i] *= 2;
    yy[i] *= 2;
    maxv = max(maxv, xx[i]);
    maxv = max(maxv, yy[i]);
    mapp[xx[i]][yy[i]] = 1;
    fun(xx[i], yy[i], xx[i - 1], yy[i - 1]);
  }
  maxv += 3;
  bfs();
  int res = 0;
  int x1, y1, x2, y2;
  for (int i = 1; i <= n; i++) {
    int temp = res;
    x1 = xx[i];
    y1 = yy[i];
    x2 = xx[i - 1];
    y2 = yy[i - 1];
    if (x1 == x2 && y1 > y2) {
      if (mapp[x1][y1 + 1] != 2) res++;
    } else if (x1 == x2 && y1 < y2) {
      if (mapp[x1][y1 - 1] != 2) res++;
    } else if (y1 == y2 && x1 > x2) {
      if (mapp[x1 + 1][y1] != 2) res++;
    } else if (y1 == y2 && x1 < x2) {
      if (mapp[x1 - 1][y1] != 2) res++;
    }
  }
  cout << res << endl;
}
int main() {
  solve();
  return 0;
}
