This documentation is automatically generated by online-judge-tools/verification-helper
#include "structure/union-find/union-find.hpp"
#pragma once
#include <bits/stdc++.h>
using namespace std;
struct UnionFind {
vector<int> data;
vector<int> f;
UnionFind() = default;
explicit UnionFind(size_t sz) : data(sz, 1), f(sz) {
iota(f.begin(), f.end(), 0);
}
bool unite(int x, int y) { // x merge to y
x = find(x), y = find(y);
if (x == y) return false;
data[y] += data[x];
f[x] = y;
return true;
}
int find(int x) {
if (f[x] == x) return x;
int y = find(f[x]);
data[y] += data[x];
f[x] = y;
return f[x];
}
int size(int x) {
return data[find(x)];
}
bool same(int x, int y) {
return find(x) == find(y);
}
vector<vector<int>> groups() {
int n = (int)data.size();
vector<vector<int>> ans(n);
for (int i = 0; i < n; i++) {
ans[find(i)].push_back(i);
}
ans.erase(remove_if(ans.begin(), ans.end(), [&](const vector<int>& v) {
return v.empty();
}),
ans.end());
return ans;
}
};
#line 2 "structure/union-find/union-find.hpp"
#include <bits/stdc++.h>
using namespace std;
struct UnionFind {
vector<int> data;
vector<int> f;
UnionFind() = default;
explicit UnionFind(size_t sz) : data(sz, 1), f(sz) {
iota(f.begin(), f.end(), 0);
}
bool unite(int x, int y) { // x merge to y
x = find(x), y = find(y);
if (x == y) return false;
data[y] += data[x];
f[x] = y;
return true;
}
int find(int x) {
if (f[x] == x) return x;
int y = find(f[x]);
data[y] += data[x];
f[x] = y;
return f[x];
}
int size(int x) {
return data[find(x)];
}
bool same(int x, int y) {
return find(x) == find(y);
}
vector<vector<int>> groups() {
int n = (int)data.size();
vector<vector<int>> ans(n);
for (int i = 0; i < n; i++) {
ans[find(i)].push_back(i);
}
ans.erase(remove_if(ans.begin(), ans.end(), [&](const vector<int>& v) {
return v.empty();
}),
ans.end());
return ans;
}
};