10
for (int i = 0; i < n; i++) par[i] = i;13
if (x == par[x]) return x;14
return par[x] = find(par[x]);16
void Union(int a, int b) {19
if (a_par == b_par) return;20
if (rank[a_par] < rank[b_par]) {22
} else if (rank[b_par] < rank[a_par]) {34
bool gcdSort(vector<int> &nums) {36
int max_nums = INT_MIN;37
for (int i = 0; i < n; i++) max_nums = max(max_nums, nums[i]);39
DSU dsu(max_nums + 1);40
vector<int> sortedNums(nums);41
sort(sortedNums.begin(), sortedNums.end());42
for (int i = 0; i < n; i++) {43
vector<int> factorsOfNumsi = getAllFactors(nums[i]);44
int numFactors = factorsOfNumsi.size();45
for (int j = 0; j < numFactors; j++) {46
dsu.Union(nums[i], factorsOfNumsi[j]);49
for (int i = 0; i < n; i++) {50
if (dsu.find(nums[i]) != dsu.find(sortedNums[i])) return false;54
vector<int> getAllFactors(int x) {57
factors.push_back(spf[x]);64
for (int i = 2; i < n; i++) spf[i] = i;65
for (int i = 2; i * i < n; i++) {67
for (int j = i * i; j < n; j += i) {68
if (spf[j] > i) spf[j] = i;