#include<bits/stdc++.h> usingnamespace std; #define ll long long constint N = 2e5 + 10; constint INF = 0x3f3f3f3f; int n, k; int a[N]; vector<int>G[N]; int son[N], siz[N], dep[N]; ll sum[N], cnt[N], ans[N]; voiddfs1(int u, int _fa){ dep[u] = dep[_fa] + 1; siz[u] = 1; for (int v : G[u]) { if (v == _fa)continue; dfs1(v, u); siz[u] += siz[v]; if (siz[v] > siz[son[u]])son[u] = v; } } voidadd(int u, int _fa, int op){ sum[dep[u]] += op * a[u]; cnt[dep[u]] += op; for (int v : G[u]) if (v != _fa)add(v, u, op); } voidquery(int u, int _fa, int lca){ int d = 2 * dep[lca] + k - dep[u]; if (d <= 0)return; ans[lca] += sum[d] + a[u] * cnt[d]; for (int v : G[u]) if (v != _fa)query(v, u, lca); } voiddsu(int u, int _fa, int op){ for (int v : G[u]) { if (v == _fa || v == son[u])continue; dsu(v, u, 0); } if(son[u])dsu(son[u], u, 1); for (int v : G[u]) { if (v == _fa || v == son[u])continue; query(v, u, u); add(v, u, 1); } cnt[dep[u]]++, sum[dep[u]] += a[u]; if (!op)add(u, _fa, -1); } intmain(){ scanf("%d%d", &n, &k); for (int i = 1; i <= n; i++)scanf("%d", &a[i]); for (int i = 1; i < n; i++) { int u, v; scanf("%d%d", &u, &v); G[u].push_back(v); G[v].push_back(u); } dfs1(1, 0); dsu(1, 0, 1); for (int i = 1; i <= n; i++)printf("%lld%c", ans[i], " \n"[i == n]); return0; }