#define _CRT_SECURE_NO_WARNINGS
#include <bits/stdc++.h>
#define endl '\n'
//#pragma GCC optimize("Ofast")
using namespace std;
using ll = long long;
using ld = long double;
using pii = pair < int, int >;
using pll = pair < ll, ll >;
const ll INF = 2e18;
const ll DIM = 400007;
const ll DIMQ = 2007;
const ld PI = 3.1415926535;
const int mod = 998244353;
struct fenwickTree {
public:
void init(int sz) {
this->sz = sz;
T.resize(sz + 1, 0);
}
void add(int pos, int val) {
pos++;
for(int i = pos; i <= sz; i += i & -i) T[i] += val;
}
int sum(int pos) {
pos++;
int res = 0;
for(int i = pos; i > 0; i -= i & -i) res += T[i];
return res;
}
private:
int sz;
vector < int > T;
};
int n, d;
vector < int > v[DIM];
int T[DIM];
int sz[DIM];
int dep[DIM];
int res[DIM];
bool used[DIM];
void sizes(int val, int prev) {
sz[val] = 1;
for(auto to: v[val]) {
if(to == prev || used[to]) continue;
sizes(to, val);
sz[val] += sz[to];
}
}
int centroid(int val, int prev, int tsz) {
for(auto to: v[val]) {
if(to == prev || used[to]) continue;
if(sz[to] > tsz / 2) return centroid(to, val, tsz);
}
return val;
}
fenwickTree t;
void dfs1(int val, int prev, int mi, int sign) {
mi = min(mi, T[val] - dep[val]);
t.add(max(mi, 0), sign);
for(auto to: v[val]) {
if(to == prev || used[to]) continue;
dep[to] = dep[val] + 1;
dfs1(to, val, mi, sign);
}
}
int cnt = 0;
void dfs2(int val, int prev, int root, int x, int compSz) {
if(dep[val] >= T[val]) cnt++;
x = min(x, T[val] + dep[val]);
if(cnt > 0) {
res[root]++;
}
if(val != root) {
if(dep[val] >= x) {
res[val] += compSz;
}
else {
res[val] += t.sum(dep[val]);
}
}
for(auto to: v[val]) {
if(to == prev || used[to]) continue;
dfs2(to, val, root, x, compSz);
}
if(dep[val] >= T[val]) cnt--;
}
void solve(int val) {
sizes(val, val);
dep[val] = 0;
t.add(T[val], 1);
for(auto to: v[val]) {
if(used[to]) continue;
dep[to] = 1;
dfs1(to, val, T[val], 1);
}
cnt = 0;
if(T[val] == 0) {
cnt = 1;
res[val]++;
}
for(auto to: v[val]) {
if(used[to]) continue;
dfs1(to, val, T[val], -1);
dfs2(to, val, val, T[val] + dep[val], sz[val] - sz[to]);
dfs1(to, val, T[val], 1);
}
for(auto to: v[val]) {
if(used[to]) continue;;
dfs1(to, val, T[val], -1);
}
cnt = 0;
t.add(T[val], -1);
used[val] = true;
for(auto to: v[val]) {
if(used[to]) continue;
sizes(to, val);
solve(centroid(to, val, sz[to]));
}
}
int main() {
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
#ifdef IloveCP
freopen("input.txt", "r", stdin);
freopen("output.txt", "w", stdout);
#endif
cin >> n >> d;
for(int i = 1; i <= n; i++) cin >> T[i];
for(int i = 1; i < n; i++) {
int v1, v2;
cin >> v1 >> v2;
v[v1].push_back(v2);
v[v2].push_back(v1);
}
t.init(DIM + 7);
for(int i = 1; i <= n; i++) res[i] = 0;
sizes(1, 1);
solve(centroid(1, 1, n));
for(int i = 1; i <= n; i++) cout << res[i] << endl;
return 0;
}