#define N 10 int tag[N], cnt[N]; void Init() { for (int i = 0; i < N; ++i) { tag[i] = i; cnt[i] = 1; } } int FindRoot(int v) { int r = v, tc; while (r != tag[r]) r = tag[r]; while (r != v) { tc = tag[v]; tag[v] = r; v = tc; } return r; } void Union(int x, int y) { if (cnt[x] > cnt[y]) { tag[y] = x; cnt[x] += cnt[y]; } else { tag[x] = y; cnt[y] += cnt[x]; } }