lca倍增模板:
1 vector<int >vc[40000+7]; 2 int deep[K],up[K][25]; 3 4 void dfs(int x,int f) 5 { 6 deep[x]=deep[f]+1,up[x][0]=f; 7 for(int i=1;i<=20;i++) 8 up[x][i]=up[up[x][i-1]][i-1]; 9 for(int i=0;i<vc[x].size();i++) 10 if(vc[x][i]!=f) 11 dfs(vc[x][i],x); 12 } 13 int lca(int x,int y) 14 { 15 if(deep[x]<deep[y])swap(x,y); 16 for(int i=20;i>=0;i--) 17 if(deep[up[x][i]]>=deep[y]) 18 x=up[x][i]; 19 if(x==y) return x; 20 for(int i=20;i>=0;i--) 21 if(up[x][i]!=up[y][i]) 22 x=up[x][i],y=up[y][i]; 23 return up[x][0]; 24 }