voiddfs(int x, bool keep){ for (int y : T1.G[x]) if (y != T1.fa[x] && y != T1.son[x]) dfs(y, 0); if (T1.son[x]) dfs(T1.son[x], 1);
for (int y : T1.G[x]) if (y != T1.fa[x] && y != T1.son[x]) { for (int i = T1.dfn[y]; i <= T1.dfn[y] + T1.sz[y] - 1; ++i) { ... } for (int i = T1.dfn[y]; i <= T1.dfn[y] + T1.sz[y] - 1; ++i) add(T2.dfn[T1.idx[i]], 1); }
add(T2.dfn[x], 1);
if (!keep) { for (int i = T1.dfn[x]; i <= T1.dfn[x] + T1.sz[x] - 1; ++i) add(T2.dfn[T1.idx[i]], -1); } }