#include using namespace std; class UnionFind { public : int* a; int n; UnionFind( int sz ) { n = sz; a = new int[n+1]; for (int i=1 ; i<=n ; i++) a[i] = -1; } // + Weighted Union void Union( int p , int q ) { int rp = Find(p); int rq = Find(q); if (rp == rq) return; int sp = -a[rp] , sq = -a[rq]; if (sp < sq) { a[rp] = rq; a[rq] = -(sp+sq); } else { a[rq] = rp; a[rp] = -(sp + sq); } } // + Collapsing Find int Find( int p ) { int r = p; while ( a[r] >= 0 ) r = a[r]; int c; while ( a[p] >= 0 ) { c = a[p]; a[p] = r; p = c; } return r; } bool isInSameSet( int p , int q ) { int rp = Find(p); int rq = Find(q); return rp == rq; } }; int main() { UnionFind u(9); cout<