#include using namespace std; using ll = long long; using ull = unsigned long long; using vi = vector; using vvi = vector>; using vll = vector; using pi = pair; using vpi = vector; struct dsu { using rec = int; using vrec = vector; vi par; int comps = 0; dsu(int n) : par(n), comps(n) { iota(par.begin(), par.end(), 0); } int find(int pos) { if (par[pos] == pos) return pos; return par[pos] = find(par[pos]); } void uni(int c, int p) { int ar = find(c); int br = find(p); if (ar != br) { --comps; par[ar] = br; } } }; void solve() { int n; cin >> n; vpi pts(n); for (auto& x : pts) cin >> x.first >> x.second; dsu ds(n); vi ord(n); iota(ord.begin(), ord.end(), 0); sort(ord.begin(), ord.end(), [&](auto a, auto b) { return pts[a].first < pts[b].first; }); for (int i = 1; i < n; ++i) { if (pts[ord[i]].first == pts[ord[i-1]].first) ds.uni(ord[i], ord[i-1]); } sort(ord.begin(), ord.end(), [&](auto a, auto b) { return pts[a].second < pts[b].second; }); for (int i = 1; i < n; ++i) { if (pts[ord[i]].second == pts[ord[i-1]].second) ds.uni(ord[i], ord[i-1]); } cout << ds.comps-1 << endl; } int main() { ios_base::sync_with_stdio(false); cin.tie(0); int t = 1; //cin >> t; while (t--) { solve(); } return 0; }