LCA倍增
#include <iostream> #include <cstdio> #include <vector> #include <cstring> using namespace std; const int maxn=5e5+10; int depth[maxn],fa[maxn][22],lg[maxn]; int tot; int head[maxn<<1],e[maxn<<1],nex[maxn<<1]; void add(int x,int y) { e[++tot]=y; nex[tot]=head[x]; head[x]=tot; } void dfs(int cur,int fath) { depth[cur]=depth[fath]+1; fa[cur][0]=fath; for(int i=1; (1<<i)<=depth[cur]; i++) { fa[cur][i]=fa[fa[cur][i-1]][i-1]; } for(int i=head[cur]; i!=-1; i=nex[i]) { if(e[i]==fath) continue; dfs(e[i],cur); } } int lca(int x,int y) { if(depth[x]<depth[y]) swap(x,y); while(depth[x]>depth[y]) x=fa[x]