#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=4e5+10;
vector<int> adj[N];
bool bk[N];
int t[N],dp[N],con[N],sz[N],d[N],ans[N],ret[N],dt,n;
struct UWU{
vector<int> fw;
int SZ;
void init(int n){fw.resize(n+1,0); SZ=n;}
void upd(int i,int val){i++; if(i>=SZ) return; for(;i<SZ;i+=i&-i) fw[i]+=val;}
int qry(int i){i++; int s=0; for(;i;i-=i&-i) s+=fw[i]; return s;}
void clr(){fw.clear();}
}T,Tp;
void fsz(int u,int p){
sz[u]=1;
for(auto v:adj[u]){
if(v==p || bk[v]) continue;
fsz(v,u);
sz[u]+=sz[v];
}
}
void fdep(int u,int p){
for(auto v:adj[u]){
if(v==p || bk[v]) continue;
d[v]=d[u]+1;
fdep(v,u);
}
}
int cen(int u,int p,int c){
for(auto v:adj[u]){
if(v==p || bk[v]) continue;
if(sz[v]*2>c) return cen(v,u,c);
}
return u;
}
void dfs(int u,int p){
for(auto v:adj[u]){
if(v==p || bk[v]) continue;
dp[v]=min(dp[u],t[v]-d[v]);
con[v]=min(con[u],t[v]+d[v]);
dfs(v,u);
}
}
void upd(int u,int p,int val){
int l=dp[u],r=dt-d[u];
l=max(l,0),r=min(r,N);
if(0<=r) Tp.upd(0,val),Tp.upd(r+1,-val);
if(l<=r) T.upd(l,val),T.upd(r+1,-val);
for(auto v:adj[u]){
if(v==p || bk[v]) continue;
upd(v,u,val);
}
}
void fd(int u,int p){
if(d[u]>=con[u]) ret[u]+=Tp.qry(d[u]);
else ret[u]+=T.qry(d[u]);
for(auto v:adj[u]){
if(v==p || bk[v]) continue;
fd(v,u);
}
}
void dec(int u,int p){
fsz(u,u);
T.init(sz[u]+10),Tp.init(sz[u]+10);
int c=cen(u,u,sz[u]);
d[c]=0;
fdep(c,c);
dp[c]=t[c];
con[c]=t[c];
dfs(c,c);
upd(c,c,1);
if(d[c]>=con[c]) ret[c]+=Tp.qry(d[c]);
else ret[c]+=T.qry(d[c]);
for(auto v:adj[c]){
if(bk[v]) continue;
upd(v,c,-1);
fd(v,c);
upd(v,c,1);
}
upd(c,c,-1);
bk[c]=1;
T.clr(),Tp.clr();
for(auto v:adj[c]){
if(bk[v]) continue;
dec(v,c);
}
}
int main(){
ios_base::sync_with_stdio(0);
cin.tie(0);
cin>>n >>dt;
for(int i=1;i<=n;i++) cin>>t[i];
for(int i=0;i<n-1;i++){
int u,v; cin>>u >>v;
adj[u].push_back(v);
adj[v].push_back(u);
}
dec(1,-1);
for(int i=1;i<=n;i++) cout<<ret[i] <<"\n";
}