#include<bits/stdc++.h>
using namespace std;
#define int long long
signed main(){
ios_base::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
int n, m; cin >> n >> m;
vector<vector<int>> adj(n + 1);
for(int i = 1; i <= n - 1; i++){
int u, v; cin >> u >> v;
adj[u].push_back(v);
adj[v].push_back(u);
}
vector<int> dist(n + 1), len(n + 1), res(n + 1), cnt(m + 1), c(n + 1);
for(int i = 1; i <= n; i++) cin >> c[i];
function<void(int, int)> dfs = [&](int u, int p){
len[u] = 1;
for(int v: adj[u]){
if(v == p) continue;
dist[v] = dist[u] + 1;
dfs(v, u);
len[u] = max(len[u], len[v] + 1);
}
};
vector<int> diddy;
int cur = 0;
function<void(int, int)> ndfs = [&](int u, int p){
vector<int> s;
for(int v: adj[u]) if(v != p) s.push_back(v);
int mx = (s.size() > 1 ? len[s[1]] : 0);
for(int v: s){
if(v == p) continue;
while(diddy.size() && mx >= dist[u] - dist[diddy.back()]){
cur -= (--cnt[c[diddy.back()]] == 0);
diddy.pop_back();
}
diddy.push_back(u);
cur += (++cnt[c[u]] == 1);
ndfs(v, u);
if(diddy.size() && diddy.back() == u){
cur -= (--cnt[c[u]] == 0);
diddy.pop_back();
}
mx = max(mx, len[v]);
}
while(diddy.size() && mx >= dist[u] - dist[diddy.back()]){
cur -= (--cnt[c[diddy.back()]] == 0);
diddy.pop_back();
}
res[u] = max(res[u], cur);
};
dfs(1, 0);
int d1 = max_element(dist.begin(), dist.end()) - dist.begin();
dfs(d1, 0);
ndfs(d1, 0);
int d2 = max_element(dist.begin(), dist.end()) - dist.begin();
dfs(d2, 0);
ndfs(d2, 0);
for(int i = 1; i <= n; i++) cout << res[i] << "\n";
}