int lca(int u, int v){ if(dep[u] < dep[v]) swap(u, v); for(int i = 20; i >= 0; --i){ if(dep[fa[u][i]] >= dep[v]) u = fa[u][i]; } if(u == v) return u; for(int i = 20; i >= 0; --i){ if(fa[u][i] != fa[v][i]) u = fa[u][i], v = fa[v][i]; } return fa[u][0]; }
dep用dfs处理,dfs中顺便处理f数组
fa[u][0] = f, dep[u] = dep[f] + 1; for(int i = 1; i <= 20; ++i) fa[u][i] = fa[fa[u][i - 1]][i - 1];