func_code_string: #include <queue>   #include <cstdio>   #include <cstring>   using namespace std;   const int Maxn=200000;   const int Inf=0x3f3f3f3f;   int n,k;   int head[Maxn+5],arrive[Maxn<<1|5],nxt[Maxn<<1|5],tot;   void add_edge(int from,int to){    arrive[++tot]=to;    nxt[tot]=head[from];    head[from]=tot;   }   queue<int> q;   int a[Maxn+5];   int dis[Maxn+5];   void init_bfs(){    memset(dis,0x3f,sizeof dis);    for(int i=1;i<=k;i++){     dis[a[i]]=0;     q.push(a[i]);    }    while(!q.empty()){     int u=q.front();     q.pop();     for(int i=head[u];i;i=nxt[i]){      int v=arrive[i];      if(dis[v]!=Inf){       continue;      }      dis[v]=dis[u]+1;      q.push(v);     }    }   }   int ans[Maxn+5];   bool del[Maxn+5];   int sz[Maxn+5];   int st[Maxn+5],top;   int dep[Maxn+5];   void size_dfs(int u,int fa){    sz[u]=1;    for(int i=head[u];i;i=nxt[i]){     int v=arrive[i];     if(v==fa||del[v]){      continue;     }     size_dfs(v,u);     sz[u]+=sz[v];    }   }   int get_weight(int x){    size_dfs(x,0);    int num=sz[x];    top=0;    st[++top]=x;    int maxn;    int root=x,root_mx=sz[x]-1;    while(top>0){     int u=st[top--];     maxn=num-sz[u];     for(int i=head[u];i;i=nxt[i]){      int v=arrive[i];      if(del[v]||sz[v]>sz[u]){       continue;      }      st[++top]=v;      maxn=max(maxn,sz[v]);     }     if(maxn<root_mx){      root=u;      root_mx=maxn;     }    }    return root;   }   void dep_sz_dfs(int u,int fa){    dep[u]=dep[fa]+1;    sz[u]=1;    for(int i=head[u];i;i=nxt[i]){     int v=arrive[i];     if(del[v]||v==fa){      continue;     }     dep_sz_dfs(v,u);     sz[u]+=sz[v];    }   }   int lis[Maxn+5],len;   int tot_sz;   void lis_dfs(int u,int fa){    if(dis[u]-1-dep[u]>=0){     lis[min(dis[u]-1-dep[u],tot_sz)]=max(lis[min(dis[u]-1-dep[u],tot_sz)],dis[u]);    }    for(int i=head[u];i;i=nxt[i]){     int v=arrive[i];     if(del[v]||v==fa){      continue;     }     lis_dfs(v,u);    }   }   void calc_dfs(int u,int fa){    ans[u]=max(ans[u],lis[dep[u]]);    for(int i=head[u];i;i=nxt[i]){     int v=arrive[i];     if(del[v]||v==fa){      continue;     }     calc_dfs(v,u);    }   }   void calc(int u){    u=get_weight(u);    dep_sz_dfs(u,0);    tot_sz=sz[u];    for(int i=0;i<=sz[u];i++){     lis[i]=-Inf;    }    lis_dfs(u,0);    for(int i=sz[u]-1;i>=0;i--){     lis[i]=max(lis[i],lis[i+1]);    }    calc_dfs(u,0);    del[u]=1;    for(int i=head[u];i;i=nxt[i]){     int v=arrive[i];     if(del[v]){      continue;     }     calc(v);    }   }   int main(){    scanf( %d ,&n);    for(int i=1;i<n;i++){     int u,v;     scanf( %d%d ,&u,&v);     add_edge(u,v);     add_edge(v,u);    }    scanf( %d ,&k);    for(int i=1;i<=k;i++){     scanf( %d ,&a[i]);    }    init_bfs();    dep[0]=-1;    calc(1);    for(int i=1;i<=n;i++){     printf( %d  ,ans[i]);    }    puts(  );    return 0;   }      