#include<iostream>
#include<vector>
using namespace std;
int n, m, idx;
int lg[300010], fa[300010][20], dep[300010];
int w[300010], root[300010][2], ch[15000010][2], sum[15000010], ans[300010];
vector<int> g[300010];
void init(int u, int f) {
fa[u][0] = f; dep[u] = dep[f] + 1;
for(int i = 1; i <= lg[dep[u]]; i ++) fa[u][i] = fa[fa[u][i - 1]][i - 1];
for(auto v : g[u])
if(v != f) init(v, u);
}
int querylca(int a, int b) {
if(dep[a] < dep[b]) swap(a, b);
while(dep[a] > dep[b]) a = fa[a][lg[dep[a] - dep[b]]];
if(a == b) return a;
for(int t = lg[dep[a]]; t; t --)
if(fa[a][t] != fa[b][t]) a = fa[a][t], b = fa[b][t];
return fa[a][0];
}
void insert(int &u, int l, int r, int x, int k) {
if(!u) u = ++idx;
sum[u] += k;
if(l == r) return ;
int mid = l + r >> 1;
if(x <= mid) insert(ch[u][0], l, mid, x, k);
else insert(ch[u][1], mid + 1, r, x, k);
}
int merge(int u, int v, int l, int r) {
if(!u || !v) return u | v;
if(l == r) {
sum[u] += sum[v];
return u;
}
int mid = l + r >> 1;
ch[u][0] = merge(ch[u][0], ch[v][0], l, mid);
ch[u][1] = merge(ch[u][1], ch[v][1], mid + 1, r);
sum[u] = sum[ch[u][0]] + sum[ch[u][1]];
return u;
}
int query(int u, int l, int r, int x) {
if(!u) return 0;
if(l == r) return sum[u];
int mid = l + r >> 1;
if(x <= mid) return query(ch[u][0], l, mid, x);
else return query(ch[u][1], mid + 1, r, x);
}
void dfs(int u, int fa) {
for(auto v : g[u]) {
if(v == fa) continue;
dfs(v, u);
root[u][0] = merge(root[u][0], root[v][0], 1, n);
root[u][1] = merge(root[u][1], root[v][1], -n, 2 * n);
}
if(dep[u] + w[u] <= n) ans[u] = query(root[u][0], 1, n, dep[u] + w[u]);
ans[u] += query(root[u][1], -n, 2 * n, dep[u] - w[u]);
}
int main() {
ios::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
cin >> n >> m;
for(int i = 1; i < n; i ++) {
int u, v; cin >> u >> v;
g[u].push_back(v); g[v].push_back(u);
}
for(int i = 2; i <= n; i ++) lg[i] = lg[i / 2] + 1;
init(1, 0);
for(int i = 1; i <= n; i ++) cin >> w[i];
for(int i = 1; i <= m; i ++) {
int s, t; cin >> s >> t;
int lca = querylca(s, t);
insert(root[s][0], 1, n, dep[s], 1);
insert(root[lca][0], 1, n, dep[s], -1);
insert(root[t][1], -n, 2 * n, 2 * dep[lca] - dep[s], 1);
insert(root[fa[lca][0]][1], -n, 2 * n, 2 * dep[lca] - dep[s], -1);
}
dfs(1, 0);
for(int i = 1; i <= n; i ++) cout << ans[i] << " ";
return 0;
}