void dfs(long u,long father){
dep[u]=dep[father]+1;//只在這里初始化depfor(long i=1;(1<<i)<=dep[u];i++)fa[u][i]=fa[fa[u][i-1]][i-1];//只這里用的倍增for(long i=head[u];~i;i=edge[i].next){long v=edge[i].to;if(v==father)continue;fa[v][0]=u;dfs(v,u);
}}
long lca(long x,long y){
if(dep[x]<dep[y])swap(x,y);for(int i=20;i>=0;i--){//跳到同一個深度if(dep[fa[x][i]]>=dep[y])x=fa[x][i];if(x==y)return x;
}for(int i=20;i>=0;i--){if(fa[x][i]!=fa[y][i]){//一起跳x=fa[x][i];y=fa[y][i];}
}
return fa[x][0];
}
提單1
題單2