1 #include<cstring>
2 #include<cstdio>
3 #include<cstdlib>
4 #include<iostream>
5 #include<cmath>
6 #include<algorithm>
7 using namespace std;
8 int n,m;
9 struct data
10 {
11 int to,next;
12 }a[600001],upj[600001],downa[600001],downj[600001];
13 int c[300001];
14 int headupj[300001],headdowna[300001],headdownj[300001];
15 int cntupj,cntdowna,cntdownj;
16 int head[300001],cnt;
17 int f[300001][21];
18 int deep[300001];
19 int w[300001];
20 int up[600101],down[600101];
21 int ans[300001];
22 void add(int u,int v){a[cnt].next=head[u];a[cnt].to=v;head[u]=cnt;cnt++;}
23 void addupj(int u,int v){upj[cntupj].next=headupj[u];upj[cntupj].to=v;headupj[u]=cntupj;cntupj++;}
24 void adddowna(int u,int v){downa[cntdowna].next=headdowna[u];downa[cntdowna].to=v;headdowna[u]=cntdowna;cntdowna++;}
25 void adddownj(int u,int v){downj[cntdownj].next=headdownj[u];downj[cntdownj].to=v;headdownj[u]=cntdownj;cntdownj++;}
26 void dfs(int now,int fa,int d)
27 {
28 deep[now]=d;
29 f[now][0]=fa;
30 //cout<<now<<endl;
31 for(int i=1;i<=20&&((1<<i)<=deep[now]);i++) f[now][i]=f[f[now][i-1]][i-1];
32 for(int i=head[now];i>=0;i=a[i].next)
33 if(a[i].to!=fa) dfs(a[i].to,now,d+1);
34 }
35 int lca(int x,int y)
36 {
37 if(deep[x]<deep[y]) swap(x,y);
38 int t=deep[x]-deep[y];
39 for(int i=20;i>=0;i--)if((1<<i)&t) x=f[x][i];
40 for(int i=20;i>=0;i--) if(f[x][i]!=f[y][i]) x=f[x][i],y=f[y][i];
41 return x==y?x:f[x][0];
42 }
43 void dfs1(int now,int fa)
44 {
45 int u=up[w[now]+deep[now]],v=down[deep[now]-w[now]+300005];
46 up[deep[now]]+=c[now];
47 for(int i=headdowna[now];i>=0;i=downa[i].next) down[downa[i].to]++;
48 for(int i=head[now];i>=0;i=a[i].next) if(a[i].to!=fa) dfs1(a[i].to,now);
49 ans[now]=up[w[now]+deep[now]]+down[deep[now]-w[now]+300005]-u-v;
50 for(int i=headupj[now];i>=0;i=upj[i].next){up[upj[i].to]--;if(w[now]+deep[now]==upj[i].to) ans[now]--;}
51 for(int i=headdownj[now];i>=0;i=downj[i].next) down[downj[i].to]--;
52 }
53 int main()
54 {
55 //freopen("running.in","r",stdin);
56 //freopen("running.out","w",stdout);
57 memset(head,-1,sizeof(head));
58 memset(headdowna,-1,sizeof(headdowna));
59 memset(headdownj,-1,sizeof(headdownj));
60 memset(headupj,-1,sizeof(headupj));
61 scanf("%d%d",&n,&m);
62 for(int i=1;i<n;i++)
63 {
64 int u,v;
65 scanf("%d%d",&u,&v);
66 add(u,v);
67 add(v,u);
68 }
69 //cout<<1;
70 dfs(1,0,0);
71 /*for(int i=1;i<=n;i++)
72 for(int j=1;j<=20;j++)
73 cout<<i<<‘ ‘<<j<<‘ ‘<<f[i][j]<<endl;
74 /*for(int j=1;j<=20;j++)
75 for(int i=1;i<=n;i++) f[i][j]=f[f[i][j-1]][j-1];*/
76 for(int i=1;i<=n;i++) scanf("%d",&w[i]);
77 //cout<<1;
78 for(int i=1;i<=m;i++)
79 {
80 int x,y;
81 scanf("%d%d",&x,&y);
82 c[x]++;
83 int LCA=lca(x,y);
84 int t=deep[y]+deep[x]-2*deep[LCA];
85 int d=deep[y]-t+300005;
86 addupj(LCA,deep[x]);
87 adddowna(y,d);
88 adddownj(LCA,d);
89 }
90 //cout<<1;
91 dfs1(1,0);
92 for(int i=1;i<n;i++) printf("%d ",ans[i]);
93 printf("%d",ans[n]);
94 }