#include <cstdio>
const int M = 100005;
int read()
{
	int x=0,f=1;char c;
	while((c=getchar())<'0' || c>'9') {if(c=='-') f=-1;}
	while(c>='0' && c<='9') {x=(x<<3)+(x<<1)+(c^48);c=getchar();}
	return x*f;
}
int n,k,tot,a[M],f[M],g[M],ans[M],dp[M][45];
struct edge
{
	int v,next;
}e[2*M];
void pre(int u,int fa)
{
	dp[u][0]^=a[u];
	for(int i=f[u];i;i=e[i].next)
	{
		int v=e[i].v;
		if(v==fa) continue;
		pre(v,u);
		for(int j=0;j<2*k;j++)
			dp[u][(j+1)%(2*k)]^=dp[v][j];
	}
}
void dfs(int u,int fa)
{
	for(int i=k;i<2*k;i++) ans[u]^=dp[u][i];
	for(int i=f[u];i;i=e[i].next)
	{
		int v=e[i].v;
		if(v==fa) continue;
		for(int j=0;j<2*k;j++)
			g[(j+1)%(2*k)]=dp[u][(j+1)%(2*k)]^dp[v][j];
		for(int j=0;j<2*k;j++)
			dp[v][(j+1)%(2*k)]^=g[j];
		dfs(v,u);
	}
}
signed main()
{
	n=read();k=read();
	for(int i=1;i<n;i++)
	{
		int u=read(),v=read();
		e[++tot]=edge{v,f[u]},f[u]=tot;
		e[++tot]=edge{u,f[v]},f[v]=tot;
	}
	for(int i=1;i<=n;i++)
		a[i]=read();
	pre(1,0);
	dfs(1,0);
	for(int i=1;i<=n;i++)
		printf("%d ",ans[i]!=0);
}