intgetlca(int u, int v){ while (top[u] != top[v]) { if (dep[top[u]] > dep[top[v]]) u = fa[top[u]]; else v = fa[top[v]]; } return dep[u] > dep[v] ? v : u; }
voidupdate_path(int u, int v, int d){ while (top[u] != top[v]) { if (dep[top[u]] > dep[top[v]]) update(dfsn[top[u]], dfsn[u], d), u = fa[top[u]]; elseupdate(dfsn[top[v]], dfsn[v], d), v = fa[top[v]]; } if (dep[u] > dep[v]) update(dfsn[v], dfsn[u], d); elseupdate(dfsn[u], dfsn[v], d); }
intquery_path(int u, int v){ int ans = 0; while (top[u] != top[v]) { if (dep[top[u]] > dep[top[v]]) ans += query(dfsn[top[u]], dfsn[u]), u = fa[top[u]]; else ans += query(dfsn[top[v]], dfsn[v]), v = fa[top[v]]; } if (dep[u] > dep[v]) ans += query(dfsn[v], dfsn[u]); else ans += query(dfsn[u], dfsn[v]); return ans; }
voidupdate_subtree(int u, int d){ update(dfsn[u], dfsnR[u], d); }
voiddfs(int u, int fau = -1, bool keep = 1){ // 遍历轻子树 递归求解 for (auto v : E[u]) { if (v != fau && v != hson[u]) dfs(v, u, 0); } // 遍历重子树 递归求解 求解当前节点 if (hson[u]) dfs(hson[u], u, 1); // 遍历轻子树 求解当前节点 add(u); for (auto v : E[u]) { if (v != fau && v != hson[u]) for (int i = dfsn[v]; i <= dfsnR[v]; ++i) add(tdfsn[i]); // 计算对info的影响 } // 利用info计算ans cal(u); // 不保留对info的影响 回溯前删除 if (!keep) { for (int i = dfsn[u]; i <= dfsnR[u]; ++i) del(tdfsn[i]); // 删除对info的影响 } }