[模板]LCA:倍增
1 void dfs(int p){ 2 for(int i=1;i<=12;++i)f[p][i]=f[f[p][i-1]][i-1]; 3 for(int i=fir[p];i;i=l[i])if(to[i]!=f[p][0])f[to[i]][0]=p,dep[to[i]]=dep[p]+1,dfs(to[i]); 4 } 5 int lca(int a,int b){ 6 if(dep[a]<dep[b])res=a,a=b,b=res; 7 for(int dt=dep[a]-dep[b];dt;dt-=dt&-dt)a=f[a][lwb[dt&-dt]]; 8 if(a==b)return a; 9 for(int i=12;i>=0;--i)if(f[a][i]!=f[b][i])a=f[a][i],b=f[b][i]; 10 return f[a][0]; 11 }
$Fate \ is \ Fake$