#include<iostream>
#include<map>
#include<cmath>
#define N 300005
using namespace std;
int n,m;
int End[N],Next[N],Head[N],idx;
int End1[N],Next1[N],Head1[N],idx1;
int End2[N],Next2[N],Head2[N],idx2;
int deep[N],father[N][20],w[N];
map<long long ,long long> b1,b2;
int snum[N],dist[N],s[N],t[N];
int ans[N];
inline void add(int a,int b){
idx++;End[idx]=b;Next[idx]=Head[a];Head[a]=idx;
}
inline void add1(int a,int b){
idx1++;End1[idx1]=b;Next1[idx1]=Head1[a];Head1[a]=idx1;
}
inline void add2(int a,int b){
idx2++;End2[idx2]=b;Next2[idx2]=Head2[a];Head2[a]=idx2;
}
inline void dfs1(int p){
for(int i=1;(1<<i)<=deep[p];i++){
father[p][i]=father[father[p][i-1]][i-1];
}
for(int i=Head[p];i;i=Next[i]){
int j=End[i];
if(j==father[p][0])continue;
father[j][0]=p;deep[j]=deep[p]+1;
dfs1(j);
}
}
inline void dfs2(int p){
int t1=b1[w[p]+deep[p]],t2=b2[w[p]-deep[p]];
for(int i=Head[p];i;i=Next[i]){
int j=End[i];
if(j==father[p][0])continue;
dfs2(j);
}
b1[deep[p]]+=snum[p];
for(int i=Head1[p];i;i=Next1[i]){
int j=End1[i];
b2[dist[j]-deep[t[j]]]++;
}
ans[p]+=b1[w[p]+deep[p]]-t1+b2[w[p]-deep[p]]-t2;
for(int i=Head2[p];i;i=Next2[i]){
int j=End2[i];
b1[deep[s[j]]]--;
b2[dist[j]-deep[t[j]]]--;
}
}
inline int getl(int x,int y){
if(x==y) return x;
if(deep[x]<deep[y]){int t=x,tt=y;x=tt,y=t;}
int t=log(deep[x]-deep[y])/log(2);
for(int i=t;i>=0;i--){
if(deep[father[x][i]]>=deep[y]){
x=father[x][i];
}if(x==y) return x;
}
t=log(deep[x])/log(2);
for(int i=t;i>=0;i--){
if(father[x][i]!=father[y][i]){
x=father[x][i];y=father[y][i];
}
}
return father[x][0];
}
int main(){
std::ios::sync_with_stdio(false);
std::cin.tie(0);std::cout.tie(0);;
cin>>n>>m;
for(int i=1;i<n;i++){
int a,b;cin>>a>>b;
add(a,b);add(b,a);
}
deep[1]=1;father[1][0]=1;
dfs1(1);
for(int i=1;i<=n;i++) cin>>w[i];
for(int i=1;i<=m;i++){
cin>>s[i]>>t[i];
int lca=getl(s[i],t[i]);
dist[i]=deep[s[i]]+deep[t[i]]-2*deep[lca];
snum[s[i]]++;
add1(t[i],i);add2(lca,i);
if(deep[lca]+w[lca]==deep[s[i]]) ans[lca]--;
}
dfs2(1);
for(int i=1;i<=n;i++){
cout<<ans[i]<<" ";
}
return 0;
}