小P的Civilization V
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include<bits/stdc++.h> 2 using namespace std; 3 const int maxn=5e5+10; 4 struct edge 5 { 6 int u,v,nxt; 7 }e[maxn<<1]; 8 int head[maxn],js; 9 void addage(int u,int v) 10 { 11 e[++js].u=u;e[js].v=v; 12 e[js].nxt=head[u];head[u]=js; 13 } 14 int n,m,q; 15 int w[maxn],f[maxn][20],dep[maxn]; 16 void dfs(int u,int fa) 17 { 18 f[u][0]=fa;dep[u]=dep[fa]+1; 19 for(int i=1;f[u][i-1];++i)f[u][i]=f[f[u][i-1]][i-1]; 20 for(int i=head[u];i;i=e[i].nxt) 21 { 22 int v=e[i].v; 23 if(v==fa)continue; 24 dfs(v,u); 25 } 26 } 27 int ff[maxn][20]; 28 void dfs2(int u,int fa) 29 { 30 for(int i=head[u];i;i=e[i].nxt) 31 { 32 int v=e[i].v; 33 if(v==fa)continue; 34 dfs2(v,u); 35 w[u]+=w[v]; 36 } 37 } 38 void dfs3(int u,int fa) 39 { 40 ff[u][0]=w[u]; 41 for(int i=1;f[u][i-1];++i)ff[u][i]=max(ff[u][i-1],ff[f[u][i-1]][i-1]); 42 for(int i=head[u];i;i=e[i].nxt) 43 { 44 int v=e[i].v; 45 if(v==fa)continue; 46 dfs3(v,u); 47 } 48 } 49 int lca(int u,int v) 50 { 51 if(dep[u]<dep[v])swap(u,v); 52 for(int i=19;i>=0;--i)if(dep[f[u][i]]>=dep[v])u=f[u][i]; 53 if(u==v)return u; 54 for(int i=19;i>=0;--i) 55 if(f[u][i]!=f[v][i]) 56 { 57 u=f[u][i];v=f[v][i]; 58 } 59 return f[u][0]; 60 } 61 int lca_(int u,int v) 62 { 63 int ans=0; 64 if(dep[u]<dep[v])swap(u,v); 65 for(int i=19;i>=0;--i)if(dep[f[u][i]]>=dep[v])ans=max(ans,ff[u][i]),u=f[u][i]; 66 if(u==v)return max(ans,w[u]); 67 for(int i=19;i>=0;--i) 68 if(f[u][i]!=f[v][i]) 69 { 70 ans=max(ans,max(ff[u][i],ff[v][i])); 71 u=f[u][i];v=f[v][i]; 72 } 73 ans=max(max(ans,max(w[u],w[v])),w[f[u][0]]); 74 return ans; 75 } 76 int main() 77 { 78 scanf("%d%d%d",&n,&m,&q); 79 for(int v,i=2;i<=n;++i) 80 { 81 scanf("%d",&v); 82 addage(i,v);addage(v,i); 83 } 84 dfs(1,0); 85 for(int u,v,i=1;i<=m;++i) 86 { 87 scanf("%d%d",&u,&v); 88 w[u]++;w[v]++; 89 int l=lca(u,v); 90 w[l]--;w[f[l][0]]--; 91 } 92 dfs2(1,0); 93 dfs3(1,0); 94 for(int u,v,i=1;i<=q;++i) 95 { 96 scanf("%d%d",&u,&v); 97 printf("%d\n",lca_(u,v)); 98 } 99 return 0; 100 }