int dep[maxn];//存u的深度
int fa[maxn][50];//存从u向上跳pow(2,i)的祖先节点
//流程:1.dfs创建st表
//2.利用st表求LCA
vector<int>e[maxn];
void dfs(int u,int father){
dep[u]=dep[father]+1;
fa[u][0]=father;
for(int i=1;i<=19;i++){
fa[u][i]=fa[fa[u][i-1]][i-1];
}
for(int v:e[u]){
if(v!=father)dfs(v,u);
}
}
int lca(int u,int v){
if(dep[u]<dep[v])swap(u,v);
for(int i=19;i>=0;i--){
if(dep[fa[u][i]]>=dep[v]){
u=fa[u][i];
}
if(u==v)return v;
}
for(int i=19;i>=0;i--){
if(fa[u][i]!=fa[v][i]){
u=fa[u][i];v=fa[v][i];
}
}
return fa[u][0];
}