struct DSU {
vector<int> fa, sz, st;
DSU(int n) {
fa.resize(n);
sz.assign(n, 1);
iota(fa.begin(), fa.end(), 0);
}
int find(int x) {
return fa[x] == x ? x : find(fa[x]);
}
void merge(int x, int y) { //合并函数
x = find(x), y = find(y);
if (x == y) return;
if (sz[x] < sz[y]) swap(x, y);
st.push_back(y), fa[y] = x, sz[x] += sz[y];
}
bool check(int x, int y) {
x = find(x), y = find(y);
return x == y;
}
void delet() { //删除栈顶边
if (st.empty()) return;
int y = st.back();
st.pop_back();
sz[fa[y]] -= sz[y], fa[y] = y;
}
void back(int t = 0) {
while (st.size() > t) {
delet();
}
} //删除到只剩t条边
int size() {
return st.size();
}
};