#include <bits/stdc++.h>
using namespace std;
const int N = 100005;
struct node {
  int x, y;
  inline bool operator<(const node &a) const {
    if (x == a.x) return y < a.y;
    return x < a.x;
  }
};
set<node> Sx[25], Sy[25];
int n, ans;
inline long long getint() {
  long long x = 0;
  char c = getchar();
  bool flag = false;
  while ((c != '-') && ((c < '0') || (c > '9'))) c = getchar();
  if (c == '-') flag = true, c = getchar();
  while ((c >= '0') && (c <= '9'))
    x = x * 10 + (long long)(c - '0'), c = getchar();
  if (flag)
    return -x;
  else
    return x;
}
void init() {
  n = getint();
  ans = 0;
  for (int i = 1; i <= n; i++) {
    int x = getint(), y = getint();
    Sx[0].insert((node){x, y});
    Sy[0].insert((node){y, x});
  }
}
void solve(int now) {
  set<node>::iterator L, R, U, D, pL, pR, pU, pD;
  while (true) {
    L = Sy[now].begin();
    R = Sy[now].end();
    R--;
    U = Sx[now].begin();
    D = Sx[now].end();
    D--;
    Sx[now + 1].clear();
    Sy[now + 1].clear();
    int flag = 0, i;
    for (i = 0; (L != Sy[now].end()) && (U != Sx[now].end()); i++) {
      if (i != 0) {
        if ((*L).x - (*pL).x > 1) {
          flag = 1;
          break;
        }
        if ((*R).x - (*pR).x < -1) {
          flag = 2;
          break;
        }
        if ((*U).x - (*pU).x > 1) {
          flag = 3;
          break;
        }
        if ((*D).x - (*pD).x < -1) {
          flag = 4;
          break;
        }
      }
      pL = L;
      pR = R;
      pD = D;
      pU = U;
      L++, R--;
      U++, D--;
    }
    if (flag == 0) {
      ans++;
      break;
    }
    if (flag == 1) {
      L = Sy[now].begin();
      for (int j = 1; j <= i; j++) {
        node px;
        px.x = (*L).y;
        px.y = (*L).x;
        node py;
        py.x = (*L).x;
        py.y = (*L).y;
        L++;
        Sx[now].erase(px);
        Sy[now].erase(py);
        Sx[now + 1].insert(px);
        Sy[now + 1].insert(py);
      }
    }
    if (flag == 2) {
      R = Sy[now].end();
      R--;
      for (int j = 1; j <= i; j++) {
        node px;
        px.x = (*R).y;
        px.y = (*R).x;
        node py;
        py.x = (*R).x;
        py.y = (*R).y;
        R--;
        Sx[now].erase(px);
        Sy[now].erase(py);
        Sx[now + 1].insert(px);
        Sy[now + 1].insert(py);
      }
    }
    if (flag == 3) {
      U = Sx[now].begin();
      for (int j = 1; j <= i; j++) {
        node px;
        px.x = (*U).x;
        px.y = (*U).y;
        node py;
        py.x = (*U).y;
        py.y = (*U).x;
        U++;
        Sx[now].erase(px);
        Sy[now].erase(py);
        Sx[now + 1].insert(px);
        Sy[now + 1].insert(py);
      }
    }
    if (flag == 4) {
      D = Sx[now].end();
      D--;
      for (int j = 1; j <= i; j++) {
        node px;
        px.x = (*D).x;
        px.y = (*D).y;
        node py;
        py.x = (*D).y;
        py.y = (*D).x;
        D--;
        Sx[now].erase(px);
        Sy[now].erase(py);
        Sx[now + 1].insert(px);
        Sy[now + 1].insert(py);
      }
    }
    solve(now + 1);
  }
}
int main() {
  init();
  solve(0);
  printf("%d\n", ans);
  return 0;
}
