#include<bits/stdc++.h> using namespace std; typedef long long ll; const int N = 3e5+1;
int read(){ int x=0;char ch=getchar(); while(ch<'0'||ch>'9')ch=getchar(); while(ch>='0'&&ch<='9')x=(x<<3)+(x<<1)+ch-'0',ch=getchar(); return x; }
int n,k,q[N],bel[N],a[N],c[N],d[N],dfn[N],f[N][19],ans[N],g1[N],head[N],cnt,st[N],sz[N]; struct nd{ int ne,to; }e[N*2];
void in(int x,int y){ if(x==y||!x||!y)return; e[++cnt].to=y;e[cnt].ne=head[x];head[x]=cnt; }
int dfs(int x,int fa=-1){ static int totw=0; dfn[x]=++totw;sz[x]=1; for(int i=head[x];i;i=e[i].ne) if(e[i].to!=fa){ int y=e[i].to; d[y]=d[x]+1;f[y][0]=x; dfs(y,x); sz[x]+=sz[y]; } }
int lca(int x,int y){
if(d[x]<d[y])swap(x,y); for(int i=18;i>=0;--i) if(d[f[x][i]]>=d[y])x=f[x][i]; if(x==y){
return x; } for(int i=18;i>=0;--i) if(f[x][i]!=f[y][i])x=f[x][i],y=f[y][i];
return f[x][0]; }
int dis(int x,int y){ return d[x]+d[y]-2*d[lca(x,y)]; }
bool cmp(int a,int b){ return dfn[a]<dfn[b]; }
void dfs1(int x,int fa=-1){
c[++c[0]]=x;g1[x]=sz[x]; for(int i=head[x];i;i=e[i].ne) if(e[i].to!=fa){ int y=e[i].to; dfs1(y,x); if(!bel[y])continue; if(!bel[x])bel[x]=bel[y]; else{ int d1=dis(bel[x],x); int d2=dis(bel[y],x); if(d2<d1||(d2==d1&&bel[y]<bel[x]))bel[x]=bel[y]; } } }
void dfs2(int x,int fa=-1){ for(int i=head[x];i;i=e[i].ne) if(e[i].to!=fa){ int y=e[i].to; if(!bel[y])bel[y]=bel[x]; else{ int d1=dis(bel[x],y); int d2=dis(bel[y],y); if(d1<d2||(d1==d2&&bel[x]<bel[y]))bel[y]=bel[x]; } dfs2(y,x); } }
void solve(int x,int y){
int son=y,mid=y,now,d1,d2; for(int i=18;i>=0;--i) if(d[f[son][i]]>d[x])son=f[son][i]; g1[x]-=sz[son]; if(bel[x]==bel[y])return void(ans[bel[x]]+=sz[son]-sz[y]); for(int i=18;i>=0;--i){ now=f[mid][i]; if(d[now]<=d[x])continue; d1=dis(bel[x],now);d2=dis(bel[y],now); if(d2<d1||(d2==d1&&bel[y]<bel[x]))mid=now; } ans[bel[x]]+=sz[son]-sz[mid]; ans[bel[y]]+=sz[mid]-sz[y]; return; }
void solve(){ sort(q+1,q+k+1,cmp);cnt=0;c[0]=0; for(int i=1;i<=k;++i)bel[q[i]]=q[i]; int L=0; st[++L]=1; for(int i=1;i<=k;++i){ int x=q[i],l=lca(x,st[L]); while(1){ if(dfn[l]>=dfn[st[L-1]]){ in(l,st[L--]); if(st[L]!=l)st[++L]=l; break; } in(st[L-1],st[L]);L--; } if(x!=st[L])st[++L]=x; } while(--L)in(st[L],st[L+1]);
dfs1(1);dfs2(1);
for(int i=1;i<=c[0];++i){ int x=c[i]; for(int j=head[x];j;j=e[j].ne) solve(x,e[j].to); } for(int i=1;i<=c[0];++i)ans[bel[c[i]]]+=g1[c[i]]; for(int i=1;i<=k;++i)printf("%d ",ans[a[i]]);printf("\n"); for(int i=1;i<=c[0];++i){ int x=c[i]; head[x]=ans[x]=g1[x]=bel[x]=0; } return; }
int main(){
n=read(); for(int i=1,x,y;i<n;++i) x=read(),y=read(),in(x,y),in(y,x); int Q=read(); d[1]=1;dfs(1); for(int j=1;j<19;++j) for(int i=1;i<=n;++i) f[i][j]=f[f[i][j-1]][j-1]; memset(head,0,sizeof(head));cnt=0; while(Q--){ k=read(); for(int i=1;i<=k;++i)a[i]=q[i]=read(); solve(); } }
|