constint N = 5e5 + 10, M = 1e6 + 10; int n, m, h[N], e[M], ne[M], idx; vector<int> pre[N], son[N]; int fa[N]; inlinevoidadd(int a, int b){ e[idx] = b, ne[idx] = h[a], h[a] = idx ++; }
int dfn[N], A[N], dfs_clock; int sdom[N]; voiddfs(int u){ dfn[u] = ++dfs_clock, A[dfs_clock] = u; for(int i = h[u]; i != -1; i = ne[i]) { int v = e[i]; if(!dfn[v]) son[u].emplace_back(v), fa[v] = u, dfs(v); } } int p[N], ans[N]; intfind(int x){ if(x == p[x]) return x; find(p[x]); if(dfn[ans[p[x]]] < dfn[ans[x]]) ans[x] = ans[p[x]]; p[x] = p[p[x]]; return p[x]; }
int anc[20][N], dep[N]; inlineintlca(int u, int v){ if(dep[u] < dep[v]) swap(u, v); for(int i = 19; i >= 0; i --) if(dep[anc[i][u]] >= dep[v]) u = anc[i][u]; if(u == v) return u; for(int i = 19; i >= 0; i --) if(anc[i][u] != anc[i][v]) u = anc[i][u], v = anc[i][v]; return anc[0][u]; }
int siz[N]; vector<int> DT_son[N]; voiddfs_DT(int u){ siz[u] = 1; for(int v : DT_son[u]) dfs_DT(v), siz[u] += siz[v]; }