【题目分析】
树状数组
【代码】
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
int t[250001],in[250001],out[250001];
int h[500001],to[500001],ne[500001];
int cnt=0,n,q,en=0,x;
char s[11];
inline void add(int a,int b)
{ne[en]=h[a];to[en]=b;h[a]=en++;}
inline int gs(int x)
{
int ret=0;
for (int i=x;i;i-=i&(-i)) ret+=t[i];
return ret;
}
inline void add2(int x,int f)
{for (int i=x;i<=n;i+=i&(-i)) t[i]+=f;}
inline void dfs(int k)
{
in[k]=++cnt;
for (int i=h[k];i>=0;i=ne[i])
if (!in[to[i]]) dfs(to[i]);
out[k]=cnt;
}
int main()
{
memset(h,-1,sizeof h);
scanf("%d",&n);
for (int i=1;i<n;++i)
{
int a,b;
scanf("%d%d",&a,&b);
add(a,b);add(b,a);
}
dfs(1);
for (int i=1;i<=n;++i)
{
scanf("%d",&x);
printf("%d\n",gs(in[x]));
add2(in[x],1);
add2(out[x]+1,-1);
}
}