#include <bits/stdc++.h>   using namespace std;   const int maxn = 1e5 + 5;   int n, x[maxn], y[maxn];   int solve(set<pair<int, int> >& a, set<pair<int, int> >& b) {     set<pair<int, int> >::iterator itl = a.begin(), itd = b.begin(), it1;     set<pair<int, int> >::reverse_iterator itr = a.rbegin(), itu = b.rbegin(),                                            it2;     set<pair<int, int> > f, s;     bool chk = false;     for (int i = 0; i < a.size() - 1; ++i) {       if (next(itl)->first > itl->first + 1) {         chk = true;         for (it1 = a.begin(); it1 != next(itl); ++it1) {           f.insert({x[it1->second], it1->second});         }       } else if (next(itd)->first > itd->first + 1) {         chk = true;         for (it1 = b.begin(); it1 != next(itd); ++it1) {           f.insert({x[it1->second], it1->second});         }       } else if (next(itr)->first + 1 < itr->first) {         chk = true;         for (it2 = a.rbegin(); it2 != next(itr); ++it2) {           f.insert({x[it2->second], it2->second});         }       } else if (next(itu)->first + 1 < itu->first) {         chk = true;         for (it2 = b.rbegin(); it2 != next(itu); it2++) {           f.insert({x[it2->second], it2->second});         }       }       if (chk) {         for (auto u : f) {           s.insert({y[u.second], u.second});           b.erase({y[u.second], u.second});           a.erase(u);         }         return solve(a, b) + solve(f, s);       }       itl++;       itr++;       itd++;       itu++;     }     return 1;   }   int main() {     ios_base::sync_with_stdio(false);     cin.tie(0);     cin >> n;     set<pair<int, int> > xs, ys;     for (int i = 0; i < n; ++i) {       cin >> x[i] >> y[i];       xs.insert({x[i], i});       ys.insert({y[i], i});     }     cout << solve(xs, ys);     return 0;   }   