#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
#define ll long long
#define ld long double
#define ull unsigned long long
#define ff first
#define ss second
#define pii pair<int,int>
#define pll pair<long long, long long>
#define vi vector<int>
#define vl vector<long long>
#define pb push_back
#define rep(i, b) for(int i = 0; i < (b); ++i)
#define rep2(i,a,b) for(int i = a; i <= (b); ++i)
#define rep3(i,a,b,c) for(int i = a; i <= (b); i+=c)
#define count_bits(x) __builtin_popcountll((x))
#define all(x) (x).begin(),(x).end()
#define siz(x) (int)(x).size()
#define forall(it,x) for(auto& it:(x))
using namespace __gnu_pbds;
using namespace std;
typedef tree<int, null_type, less<int>, rb_tree_tag,tree_order_statistics_node_update> ordered_set;
//mt19937 mt;void random_start(){mt.seed(chrono::time_point_cast<chrono::milliseconds>(chrono::high_resolution_clock::now()).time_since_epoch().count());}
//ll los(ll a, ll b) {return a + (mt() % (b-a+1));}
const int INF = 1e9+50;
const ll INF_L = 1e18+40;
const ll MOD = 1e9+7;
int query_ans[400001];
vi graph[400001];
bool odw[400001];
int n,D;
int T[400001];
int siz_[400001];
int dist[400001];
pii seg[400001];
bool can[400001];
int sub[400001];
vi ls;
void dfs_sub(int v, int pop)
{
siz_[v] = 1;
forall(it,graph[v]) if(it != pop && !odw[it])
{
dfs_sub(it,v);
siz_[v] += siz_[it];
}
}
void dfs_prep(int v, int pop, int s, int d = 0, int ok_time = n+1, int ok2 = n+1)
{
ls.pb(v);
dist[v] = d;
ok_time = min(ok_time,max(0,T[v]-d));
ok2 = min(ok2,T[v]+d);
seg[v] = {ok_time,D-d};
can[v] = (d >= ok2);
sub[v] = s;
forall(it,graph[v]) if(it != pop && !odw[it])
{
if(v != pop) dfs_prep(it,v,s,d+1,ok_time,ok2);
else dfs_prep(it,v,it,d+1,ok_time,ok2);
}
}
int dist_cnt[400001];
unordered_map<int,int> sub_dist_cnt[400001];
vector<pii> events;
int events_ans;
int event_ptr;
vector<pii> sub_events[400001];
int sub_events_ans[400001];
int sub_event_ptr[400001];
vector<pii> queries;
void centroid(int v, int n)
{
dfs_sub(v,v);
int pop = 0;
while(true)
{
pii best = {-1,-1};
forall(it,graph[v]) if(it != pop && !odw[it]) best = max(best,{siz_[it],it});
if(best.ff > n/2)
{
pop = v;
v = best.ss;
}
else break;
}
odw[v] = 1;
ls = {};
dfs_prep(v,v,v);
forall(it,ls)
{
dist_cnt[dist[it]]++;
sub_dist_cnt[sub[it]][dist[it]]++;
}
int max_ = 0;
rep2(i,1,n)
{
if(dist_cnt[i] == 0)
{
max_ = i-1;
break;
}
dist_cnt[i] += dist_cnt[i-1];
}
forall(it,ls)
{
if(sub[it] != it || it == v) continue;
sub_dist_cnt[it][0] = 0;
rep2(i,1,siz(sub_dist_cnt[it])-1) sub_dist_cnt[it][i] += sub_dist_cnt[it][i-1];
}
forall(it,ls)
{
if(!can[it] || dist[it] > D) continue;
query_ans[it] += dist_cnt[min(max_,D-dist[it])];
if(it != v) query_ans[it] -= sub_dist_cnt[sub[it]][min(siz(sub_dist_cnt[sub[it]])-1,D-dist[it])];
}
forall(it,ls)
{
if(seg[it].ff > seg[it].ss) continue;
events.pb({seg[it].ff,1});
events.pb({seg[it].ss+1,-1});
if(it != v)
{
sub_events[sub[it]].pb({seg[it].ff,1});
sub_events[sub[it]].pb({seg[it].ss+1,-1});
}
}
sort(all(events));
forall(it,ls) if(sub[it] == it) sort(all(sub_events[it]));
forall(it,ls) if(!can[it]) queries.pb({dist[it],it});
sort(all(queries));
forall(it,queries)
{
while(event_ptr < siz(events) && events[event_ptr].ff <= it.ff)
{
events_ans += events[event_ptr].ss;
event_ptr++;
}
while(sub_event_ptr[sub[it.ss]] < siz(sub_events[sub[it.ss]]) && sub_events[sub[it.ss]][sub_event_ptr[sub[it.ss]]].ff <= it.ff)
{
sub_events_ans[sub[it.ss]] += sub_events[sub[it.ss]][sub_event_ptr[sub[it.ss]]].ss;
sub_event_ptr[sub[it.ss]]++;
}
query_ans[it.ss] += events_ans-sub_events_ans[sub[it.ss]];
}
rep(i,max_+1) dist_cnt[i] = 0;
forall(it,ls) if(sub[it] == it) sub_dist_cnt[it] = {};
events = {};
events_ans = 0;
event_ptr = 0;
queries = {};
forall(it,ls) if(sub[it] == it)
{
sub_events[it] = {};
sub_events_ans[it] = 0;
sub_event_ptr[it] = 0;
}
ls = {};
dfs_sub(v,v);
forall(it,graph[v]) if(!odw[it]) centroid(it,siz_[it]);
}
int main()
{
ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
//random_start();
cin >> n >> D;
rep2(i,1,n) cin >> T[i];
rep(i,n-1)
{
int a,b;
cin >> a >> b;
graph[a].pb(b);
graph[b].pb(a);
}
centroid(1,n);
rep2(i,1,n) cout << query_ans[i] << "\n";
}