#include<bits/stdc++.h>
using namespace std;
 
#define int long long
const int M=1e5+5;
 
int max(int x,int y){ return x>y?x:y; }
int min(int x,int y){ return x<y?x:y; }
 
int n,K,a[M];
int read(){
	int x=0,y=1;char ch=getchar();
	while(ch<'0'||ch>'9') y=(ch=='-')?-1:1,ch=getchar();
	while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();
	return x*y;
}
 
int tot=0,first[M];
struct Edge{ int nxt,to; }e[M<<1];
void add(int x,int y){
	e[++tot]=(Edge){first[x],y},first[x]=tot;
	e[++tot]=(Edge){first[y],x},first[y]=tot;
}
 
int dp[M][25][2];//dp[u][i][j] 深度 mod k =i 且, de/k mod 2 =j 的异或和 
void dfs(int u,int fa){
	dp[u][0][0]=a[u];
	for(int i=first[u];i;i=e[i].nxt){
		int v=e[i].to;if(v==fa) continue ;
		dfs(v,u);
		for(int j=0;j<K;j++){
			for(int k=0;k<2;k++){
				int nj=j,nk=k;
				nj++;
				if(nj>=K) nj-=K,nk^=1;
				dp[u][nj][nk]^=dp[v][j][k];
			}
		}
	}
}
int tmp[25][2];
void dfs2(int u,int fa){
	if(u!=1){
		for(int j=0;j<K;j++) for(int k=0;k<2;k++) tmp[j][k]=dp[fa][j][k];
		for(int j=0;j<K;j++){
			for(int k=0;k<2;k++){
				int nj=j,nk=k;
				nj++;
				if(nj>=K) nj-=K,nk^=1;
				tmp[nj][nk]^=dp[u][j][k];
			}
		}
		for(int j=0;j<K;j++){
			for(int k=0;k<2;k++){
				int nj=j,nk=k;
				nj++;
				if(nj>=K) nj-=K,nk^=1;
				dp[u][nj][nk]^=tmp[j][k];
			}
		}
	}
	for(int i=first[u];i;i=e[i].nxt){
		int v=e[i].to;if(v==fa) continue ;
		dfs2(v,u);
	}
}
 
void solve(){
	n=read(),K=read();
	for(int i=1;i<n;i++){
		int x=read(),y=read();
		add(x,y);
	}
	for(int i=1;i<=n;i++) a[i]=read();
	dfs(1,0),dfs2(1,0);
//	for(int i=1;i<=n;i++) printf("%lld ",a[i]);printf("\n");
//	for(int i=0;i<K;i++){
//		for(int j=0;j<2;j++) printf("%lld ",dp[1][i][j]);
//		printf("\n");
//	}
	for(int i=1;i<=n;i++){
		int Ans=0;
		for(int j=0;j<K;j++) Ans^=dp[i][j][1];
		if(Ans==0) printf("0 ");
		else printf("1 ");
	}
	printf("\n");
}
 
signed main(){
	solve();
}