RT,题目
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e6+10;
int n;
vector<int> G[maxn];
int sz[maxn],m,big[maxn],col[maxn],l[maxn],r[maxn],node[maxn],dfncnt,ans[maxn],cnt[maxn],colcnt;
void add(int u){
if(cnt[col[u]]==0) colcnt++;
cnt[col[u]]++;
}
void del(int u){
cnt[col[u]]--;
if(cnt[col[u]]==0) colcnt--;
}
void dfs0(int u,int p){
l[u]=++dfncnt;
node[dfncnt]=u;
sz[u]=1;
for(int i=0;i<G[u].size();i++){
int v=G[u][i];
if(v!=p){
dfs0(v,u);
if(!big[u]||sz[big[u]]<sz[v]){
big[u]=v;
}
}
}
r[u]=dfncnt;
}
void dfs1(int u,int p,bool keep){
for(int i=0;i<G[u].size();i++){
int v=G[u][i];
if(v!=p&&v!=big[u]){
dfs1(v,u,0);
}
}
if(big[u]){
dfs1(big[u],u,1);
}
for(int i=0;i<G[u].size();i++){
int v=G[u][i];
if(v!=p&&v!=big[u]){
for(int i=l[v];i<=r[v];i++){
add(node[i]);
}
}
}
add(u);
ans[u]=colcnt;
if(!keep){
for(int i=l[u];i<=r[u];i++){
del(node[i]);
}
}
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>col[i];
}
for(int i=1;i<n;i++){
int u,v;
cin>>u>>v;
G[u].push_back(v);
G[u].push_back(u);
}
dfs0(1,0);
dfs1(1,0,0);
for(int i=1;i<=m;i++){
int x;
cin>>x;
cout<<ans[x]<<endl;
}
return 0;
}