#include using namespace std; #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() #define fo(i, n) rep(i, 0, n) #define F first #define S second #define MP make_pair #define PB push_back typedef long long ll; typedef vector vi; typedef pair pii; typedef vector> vpii; typedef vector> vvi; typedef vector vll; typedef pair pll; typedef vector> vpll; typedef vector> vvll; int c = 0; vvi g; vi vis; void dfs(int i) { if (vis[i]) return; vis[i] = true; for (int x: g[i]) dfs(x); } signed main() { cin.tie(0)->sync_with_stdio(0); int n; cin >> n; g = vvi(n); vis = vi(n,0); map x, y; fo(i, n) { int a, b; cin >> a >> b; if (x.count(a)) { g[i].PB(x[a]); g[x[a]].PB(i); } if (y.count(b)) { g[i].PB(y[b]); g[y[b]].PB(i); } x[a] = i; y[b] = i; } fo(i,n) { if (!vis[i]) { dfs(i); c++; } } cout << c-1 << endl; }