#include using namespace std; #define int long long int pred[201010]; int sz[201010]; int find(int v) { if (pred[v] == v) return v; return pred[v] = find(pred[v]); } void make(int v) { pred[v] = v; sz[v] = 1; return; } bool merge(int a, int b) { a = find(a); b = find(b); if (a == b) return false; if (sz[a] < sz[b]) swap(a, b); pred[b] = a; sz[a] += sz[b]; return true; } struct Info { int x, y; int id; }; int n; Info t[201010]; bool hv[201010]; signed main() { cin.tie(0); ios::sync_with_stdio(0); cin >> n; for (int i = 1; i <= n; i++) { cin >> t[i].x >> t[i].y; t[i].id = i; } for (int i = 1; i <= n; i++) make(i); sort(t + 1, t + 1 + n, [](Info q, Info w) { return q.x < w.x; }); for (int i = 1; i + 1 <= n; i++) { if (t[i].x == t[i + 1].x) { merge(t[i].id, t[i + 1].id); } } sort(t + 1, t + 1 + n, [](Info q, Info w) { return q.y < w.y; }); for (int i = 1; i + 1 <= n; i++) { if (t[i].y == t[i + 1].y) { merge(t[i].id, t[i + 1].id); } } for (int i = 1; i <= n; i++) { hv[find(i)] = true; } int ans = 0; for (int i = 1; i <= n; i++) { if (hv[i]) ans++; } cout << ans-1 << '\n'; return 0; }