我不知道我是复杂度错了还是常数太大了。。
//#pragma GCC optimize("O2,O3,Ofast,inline,unroll-loops")
//#pragma GCC target("avx2,sse4")
#include <bits/stdc++.h>
#define il inline
using namespace std;
typedef long long ll;
const ll mod=998244353,inv2=(mod+1)/2;
il int read(){
int x=0,c=getchar();
while(!isdigit(c)) c=getchar();
while(isdigit(c)) x=x*10+c-48,c=getchar();
return x;
}
il void add(ll &x,ll y){x=(x+y>=mod?x+y-mod:x+y);}
il void del(ll &x,ll y){x=(x<y?x-y+mod:x-y);}
const int N=5e5+5,K=15,M=(1<<K)+5;
int n,k,S,B,c[N],fa[N],de[N];ll a[K],ans[N],val[M];
int siz[N],mx[N],rt,tot,vis[N];
vector<int> e[N];
il void adde(int x,int y){e[x].push_back(y);}
void predfs(int x,int fath){
fa[x]=fath,de[x]=de[fath]+1;
for(int y:e[x]) if(y!=fath) predfs(y,x);
}
void dfs0(int x,int fath){
++tot;
for(int y:e[x]) if(y!=fath && !vis[y]) dfs0(y,x);
}
void dfs(int x,int fath){
siz[x]=1,mx[x]=0;
for(int y:e[x]) if(y!=fath && !vis[y]) dfs(y,x),siz[x]+=siz[y],mx[x]=max(mx[x],siz[y]);
mx[x]=max(mx[x],tot-siz[x]);if(!rt || mx[x]<mx[rt]) rt=x;
}
int m,X,b[N],to[N],MI[N],mm,bb[N];
void DFS1(int x,int fath,int cur,int st){
if(!cur || de[x]<de[cur]) cur=x;st|=(1<<c[x]);
MI[x]=cur,to[x]=st;add(ans[MI[x]],val[to[x]]);
for(int y:e[x]) if(!vis[y] && y!=fath) DFS1(y,x,cur,st);
}
void DFS2(int x,int fath){
bb[++mm]=x;
for(int y:e[x]) if(!vis[y] && y!=fath) DFS2(y,x);
}
il int GET(int x,int y){return de[x]<de[y]?x:y;}
ll s1,s2;
il void calc1(int cccccc){
int x,y,z,u,v,w;X=cccccc,m=mm=0;
DFS1(X,0,0,0);
for(int y:e[X]){
if(vis[y]) continue;
mm=0,DFS2(y,X);
for(int i=1;i<=m;++i)
for(int j=1;j<=mm;++j){
x=b[i],y=bb[j];
add(ans[GET(MI[x],MI[y])],val[to[x]|to[y]]);
}
for(int i=1;i<=mm;++i) b[++m]=bb[i];
}
s1+=(m+1ll)*(m+1ll);
}
int in[M],in1[M];ll ss[M],SUM;
void pdfs2(int x,int fath){
to[x]=to[fath]|(1<<c[x]);
for(int y:e[x]) if(y!=fath) pdfs2(y,x);
}
int A[N],BB[N];
il void fwt(int a[]){
ll x,y,z,u,v,w;
for(int i=0;i<S;++i) ss[i]=0,A[i]=a[i];
for(int j=0;j<k;++j)
for(int i=0;i<S;++i) if((i>>j)&1) a[i]+=a[i^(1<<j)];
for(int i=0;i<S;++i){ss[i]=1ll*a[i]*a[i]%mod;if(ss[i]>=mod) ss[i]%=mod;}
for(int j=0;j<k;++j)
for(int i=0;i<S;++i) if((i>>j)&1) del(ss[i],ss[i^(1<<j)]);
for(int i=0;i<S;++i) a[i]=A[i];
}
int IN[N];
il void INIT(){
for(int i=0;i<S;++i) IN[i]=in[i];
for(int j=0;j<k;++j) for(int i=0;i<S;++i) if((i>>j)&1) IN[i]+=IN[i^(1<<j)];
}
il void FWT(int a[],int b[]){
for(int i=0;i<S;++i) A[i]=a[i],BB[i]=b[i],ss[i]=0;
for(int j=0;j<k;++j)
for(int i=0;i<S;++i) if((i>>j)&1) a[i]+=a[i^(1<<j)],b[i]+=b[i^(1<<j)];
for(int i=0;i<S;++i){ss[i]=1ll*a[i]*b[i];if(ss[i]>=mod) ss[i]%=mod;}
for(int j=0;j<k;++j)
for(int i=0;i<S;++i) if((i>>j)&1) del(ss[i],ss[i^(1<<j)]);
for(int i=0;i<S;++i) a[i]=A[i],b[i]=BB[i];
}
il void FWT1(int b[]){
for(int i=0;i<S;++i) BB[i]=b[i],ss[i]=0;
for(int j=0;j<k;++j)
for(int i=0;i<S;++i) if((i>>j)&1) b[i]+=b[i^(1<<j)];
for(int i=0;i<S;++i){ss[i]=1ll*IN[i]*b[i];if(ss[i]>=mod) ss[i]%=mod;}
for(int j=0;j<k;++j)
for(int i=0;i<S;++i) if((i>>j)&1) del(ss[i],ss[i^(1<<j)]);
for(int i=0;i<S;++i) b[i]=BB[i];
}
void dfs3(int x,int fath){
b[++m]=x;
for(int y:e[x]){
if(vis[y] || y==fath) continue;
dfs3(y,x);
}
}
int num,p[N],pre[N];
int cnt,d[N];
void dfs4(int x,int fath){
d[++cnt]=x;
for(int y:e[x]){
if(vis[y] || y==pre[x] || y==fa[x] || y==fath) continue;
dfs4(y,x);
}
}
il void calc2(int cccccc){
int x,y,z,u,v,w;X=cccccc;
to[X]=(1<<c[X]);for(int y:e[X]) if(!vis[y]) pdfs2(y,X);
add(ans[X],val[to[X]]);m=0;
ll ssss=0,sssss=0;
for(int y:e[X]) if(!vis[y] && y!=fa[X]) dfs3(y,X);
for(int i=1;i<=m;++i) add(ssss,val[to[b[i]]]),++in[to[b[i]]];
fwt(in);for(int i=0;i<S;++i) if(ss[i]) add(sssss,ss[i]*val[i]%mod);
w=(ssss+sssss)*inv2%mod,add(ans[X],w);
for(int i=0;i<S;++i) in[i]=0,ss[i]=0;
for(int y:e[X]){
if(vis[y] || y==fa[X]) continue;
m=0,dfs3(y,X);
if(1ll*m*m<=2ll*k*S){
s2+=1ll*m*m;
for(int i=1;i<=m;++i) for(int j=i+1;j<=m;++j) del(ans[X],val[to[b[i]]|to[b[j]]]);
continue;
}
s2+=1ll*k*S;
for(int i=1;i<=m;++i) ++in[to[b[i]]];
fwt(in);ll w=0;
for(int i=0;i<S;++i) if(ss[i]) add(w,ss[i]*val[i]%mod);
for(int i=1;i<=m;++i) del(w,val[to[b[i]]]);
w=w*inv2%mod,del(ans[X],w);
for(int i=1;i<=m;++i) in[to[b[i]]]=0;
}
num=0,x=X;
while(1){
if(fa[x] && !vis[fa[x]]) z=fa[x];else{z=0;break;}
pre[z]=x,x=z,p[++num]=x;
}
if(num<=0) return ;
m=0,b[++m]=X;for(int y:e[X]) if(!vis[y] && y!=fa[X]) dfs3(y,X);
for(int i=0;i<S;++i) in[i]=0;
for(int i=1;i<=m;++i) ++in[to[b[i]]];
INIT();
for(int i=1;i<=num;++i){
cnt=0,dfs4(p[i],0);
if(1ll*cnt*m<=1ll*k*S){
s2+=1ll*cnt*m;
for(int j=1;j<=cnt;++j)
for(int u=1;u<=m;++u)
add(ans[p[i]],val[to[d[j]]|to[b[u]]]);
}
else{
s2+=1ll*k*S;
for(int j=1;j<=cnt;++j) ++in1[to[d[j]]];
FWT1(in1);
for(int j=0;j<S;++j) if(ss[j]) add(ans[p[i]],ss[j]*val[j]%mod);
for(int j=1;j<=cnt;++j) in1[to[d[j]]]=0;
}
}
for(int i=1;i<=num;++i) pre[p[i]]=0;
for(int i=1;i<=m;++i) in[to[b[i]]]=0;
}
int c1,c2;
void solve(int x){
if(tot<=B) calc1(x),++c1;else calc2(x),++c2;vis[x]=1;
for(int y:e[x]){
if(vis[y]) continue;
tot=rt=0,dfs0(y,x),dfs(y,x),solve(rt);
}
}
void DDFS(int x){
for(int y:e[x]) if(y!=fa[x]) DDFS(y),add(ans[x],ans[y]);
}
int x,y,z,lg[M];ll u,v,w;
int main(){
//freopen("a1.in","r",stdin);
///freopen("a1.out","w",stdout);
scanf("%d%d",&n,&k);S=(1<<k),B=2*sqrtl(S*k);//B=n;
for(int i=0;i<k;++i) a[i]=1ll*read();
for(int i=1;i<=n;++i) c[i]=read()-1;
for(int i=1;i<n;++i) x=read(),y=read(),adde(x,y),adde(y,x);
for(int i=2;i<S;++i) lg[i]=lg[i>>1]+1;
val[0]=1;for(int i=1;i<S;++i) val[i]=val[i-(i&-i)]*a[lg[i&-i]]%mod;
predfs(1,0);
tot=n,dfs(1,0),solve(rt);
DDFS(1);
//printf("*** %d %d %d %d %lld %lld\n",n,B,c1,c2,s1,s2);
for(int i=1;i<=n;++i) printf("%lld ",ans[i]);
return 0;
}