| 6 | vector<int> g[N]; |
| 7 | int par[N][LG + 1], dep[N], sz[N]; |
| 8 | void dfs(int u, int p = 0) { |
| 9 | par[u][0] = p; |
| 10 | dep[u] = dep[p] + 1; |
| 11 | sz[u] = 1; |
| 12 | for (int i = 1; i <= LG; i++) par[u][i] = par[par[u][i - 1]][i - 1]; |
| 13 | for (auto v: g[u]) if (v != p) { |
| 14 | dfs(v, u); |
| 15 | sz[u] += sz[v]; |
| 16 | } |
| 17 | } |
| 18 | int lca(int u, int v) { |
| 19 | if (dep[u] < dep[v]) swap(u, v); |
| 20 | for (int k = LG; k >= 0; k--) if (dep[par[u][k]] >= dep[v]) u = par[u][k]; |