#include using namespace std; class UnionFind { private: vector rank, p; public: UnionFind(int n) { rank.assign(n, 0); p.assign(n, 0); for (int i = 0; i < n; i++) p[i] = i; } int find(int a) { if (p[a] == a) return a; return p[a] = find(p[a]); } void unite(int a, int b) { int pa = find(a); int pb = find(b); if (pa== pb) return; if (rank[pa] == rank[pb]) { rank[pa]++; p[pb] = pa; } else if (rank[pa] > rank[pb]) { p[pb] = pa; }else { p[pa] = pb; } } }; int main() { int n; scanf("%d", &n); unordered_map xs; unordered_map ys; vector> pts(n); int cnt = 0; for (int i = 0; i < n; i++) { int a, b; scanf("%d %d", &a, &b); pts[i] = {a, b}; if (xs[a] != 1 && ys[b] != 1) cnt++; xs[a] = 1; ys[b] = 1; } printf("%d\n", cnt - 1); return 0; }