#define MAXSIZE 50001 int father[MAXSIZE]; int rank[MAXSIZE]; void initial() { memset(rank, 0, sizeof(rank)); for ( int i =0; i < MAXSIZE; ++i ) father[i] =-1; } int find_set(int x) { int r = x, q; while(father[r] !=-1) { r = father[r]; } while(x != r) { q = father[x]; father[x] = r; x = q; } return r; } void union_set(int x, int y) { int a = find_set(x); int b = find_set(y); if (a == b) return; if (rank[a] > rank[b]) { father[b] = a; } else { father[a] = b; if (rank[a] == rank[b]) { ++rank[b]; } } }