#include <bits/stdc++.h>
using namespace std;
int N, M, flag, top;
set<pair<int, int> > stk[100005][2];
set<pair<int, int> >::iterator sx, sy, tx, ty;
pair<int, int> psx, psy, ptx, pty;
int main() {
  int i, j, t, flag;
  int x, y;
  pair<int, int> tmp, now;
  scanf("%d", &N);
  for (i = 1; i <= N; i++) {
    scanf("%d %d", &x, &y);
    swap(x, y);
    stk[1][0].insert(make_pair(x, y));
    stk[1][1].insert(make_pair(y, x));
  }
  for (i = 1, top = 1; i <= top; i++) {
    while (true) {
      flag = 0;
      sx = stk[i][0].begin(), tx = stk[i][0].end(), tx--;
      sy = stk[i][1].begin(), ty = stk[i][1].end(), ty--;
      for (j = 1; j <= stk[i][0].size(); j++) {
        if (j != 1) {
          if ((*sx).first - psx.first > 1) {
            flag = 1;
            break;
          }
          if ((*tx).first - ptx.first < -1) {
            flag = 2;
            break;
          }
          if ((*sy).first - psy.first > 1) {
            flag = 3;
            break;
          }
          if ((*ty).first - pty.first < -1) {
            flag = 4;
            break;
          }
        }
        psx = (*sx), ptx = (*tx);
        psy = (*sy), pty = (*ty);
        if (j != stk[i][0].size()) sx++, sy++, tx--, ty--;
      }
      if (flag == 0) break;
      top++;
      if (flag == 1) {
        sx = stk[i][0].begin();
        for (t = 1; t < j; t++) {
          tx = sx, sx++;
          stk[top][0].insert(*tx);
          stk[top][1].insert(make_pair((*tx).second, (*tx).first));
          stk[i][1].erase(stk[i][1].find(make_pair((*tx).second, (*tx).first)));
          stk[i][0].erase(tx);
        }
      }
      if (flag == 2) {
        sx = stk[i][0].end(), sx--;
        for (t = 1; t < j; t++) {
          tx = sx, sx--;
          stk[top][0].insert(*tx);
          stk[top][1].insert(make_pair((*tx).second, (*tx).first));
          stk[i][1].erase(stk[i][1].find(make_pair((*tx).second, (*tx).first)));
          stk[i][0].erase(tx);
        }
      }
      if (flag == 3) {
        sx = stk[i][1].begin();
        for (t = 1; t < j; t++) {
          tx = sx, sx++;
          stk[top][1].insert(*tx);
          stk[top][0].insert(make_pair((*tx).second, (*tx).first));
          stk[i][0].erase(stk[i][0].find(make_pair((*tx).second, (*tx).first)));
          stk[i][1].erase(tx);
        }
      }
      if (flag == 4) {
        sx = stk[i][1].end(), sx--;
        for (t = 1; t < j; t++) {
          tx = sx, sx--;
          stk[top][1].insert(*tx);
          stk[top][0].insert(make_pair((*tx).second, (*tx).first));
          stk[i][0].erase(stk[i][0].find(make_pair((*tx).second, (*tx).first)));
          stk[i][1].erase(tx);
        }
      }
    }
  }
  printf("%d\n", top);
  return 0;
}
