#include using namespace std; #define int long long #define rep(i, a, b) for(int i = a; i < (b); ++i) #define all(x) begin(x),end(x) #define sz(x) (int)(x).size() typedef long long ll; typedef pair pii; typedef vector vi; typedef vector> vvi; typedef vector> vpii; template using vec = vector; template using uset = unordered_set; template using umap = unordered_map; void solve() { int n; cin >> n; vpii points(n); umap xs; umap ys; rep(i, 0, n) { int x, y; cin >> x >> y; points[i] = {x, y}; xs[x].emplace_back(i); ys[y].emplace_back(i); } vi comp(n, -1); int cx = 0; uset X, Y; rep(i, 0, sz(points)) { if (comp[i] != -1) continue; queue q{{i}}; while(!q.empty()) { int u = q.front(); q.pop(); comp[u] = cx; auto [x, y] = points[u]; if (!X.count(x)) { X.emplace(x); for (int i: xs[x]) { if (comp[i] != -1) continue; q.emplace(i); comp[i] = cx; } } if (!Y.count(y)) { Y.emplace(y); for (int i: ys[y]) { if (comp[i] != -1) continue; q.emplace(i); comp[i] = cx; } } } cx++; } cout << cx - 1 << endl; } signed main() { cin.tie(0)->sync_with_stdio(0); cin.exceptions(cin.failbit); ll T = 1; // cin >> T; rep(i, 0, T) solve(); }