#include using namespace std; using ll = long long; // #define int ll // #define endl '\n' #define F first #define S second #define all(x) begin(x), end(x) #define rall(x) rbegin(x), rend(x) #define sz(x) (int)(x).size() struct Coord { int x, y, idx; }; void tc() { int n; cin >> n; vector a(n); for (int i = 0; i < n; i++) { cin >> a[i].x >> a[i].y; a[i].idx = i; } map> same_x, same_y; for (auto const& coord : a) { same_x[coord.x].push_back(coord); same_y[coord.y].push_back(coord); } map reached_row, reached_col; vector component(n); vector seen(n); int res = 0; for (int i = 0; i < n; i++) { if (seen[i]) continue; seen[i] = true; res++; queue q; q.push(a[i]); while (sz(q)) { auto [x, y, idx] = q.front(); q.pop(); if (!reached_row[y]) { for (auto coord : same_y[y]) { if (seen[coord.idx]) continue; seen[coord.idx] = true; q.push(coord); } } if (!reached_col[x]) { for (auto coord : same_x[x]) { if (seen[coord.idx]) continue; seen[coord.idx] = true; q.push(coord); } } } } cout << res - 1 << endl; } signed main() { ios::sync_with_stdio(false); cin.tie(nullptr); tc(); }