#include #define int long long #define endl '\n' #define all(x) x.begin(), x.end() #define sz(x) (int)((x).size()) #define x first #define y second using namespace std; struct dsu{ vectorp; void init(int n){ p.resize(n+1); iota(p.begin(),p.end(),0); } int ge(int x){ if(p[x]==x){ return x; } return p[x]=ge(p[x]); } bool mer(int x,int y){ x=ge(x),y=ge(y); if(x!=y){ p[x]=y; return 1; } return 0; } }; void solve([[maybe_unused]] int test_case){ int n; cin>>n; paira[n+1]; map>mpx; map>mpy; for(int i=1;i<=n;i++){ cin>>a[i].x>>a[i].y; mpx[a[i].x].push_back(i); mpy[a[i].y].push_back(i); } int re=n; dsu d; d.init(n+2); for(auto &[i,j]:mpx){ int fi=j[0]; for(auto id:j){ re-=d.mer(fi,id); } } for(auto &[i,j]:mpy){ int fi=j[0]; for(auto id:j){ re-=d.mer(fi,id); } } cout<>test; for(int _=1;_<=test;_++){ solve(_); } return 0; }