#include <bits/stdc++.h>

using namespace std;

const int MX = 100005;
const int MK = 25;

int n, k;
int fst[MX], nxt[2 * MX], to[2 * MX], dp[2 * MX][MK];
int pre[MX], rlt[MX];

int REV(int e) { return e > n ? e - n : e + n; }

void add_edge(int a, int b, int i) {
	nxt[i] = fst[a];
	fst[a] = i;
	to[i] = b;
}

int d[MX][MK], sum, dt[MX];

void DFS(int u, int p) {
	dt[u] = dt[p] + 1;
	if((dt[u] / k) & 1) sum ^= pre[u];
	for(int e = fst[u]; e; e = nxt[e]) {
		if(to[e] == p) continue;
		int v = to[e];
		DFS(v, u);
	}
}

void DFS_00(int u, int p) {
	d[u][0] = pre[u];
	for(int e = fst[u]; e; e = nxt[e]) {
		if(to[e] == p) continue;
		dp[e][0] ^= pre[u];
		int v = to[e];
		DFS_00(v, u);
		for(int i = 0; i < k; i ++) {
			dp[e][(i + 1) % k] ^= d[v][i];
			d[u][(i + 1) % k] ^= d[v][i];
		}
	}
}

void DFS_01(int u, int p, int c) {
	int f = 0;
	for(int e = fst[u]; e; e = nxt[e]) {
		if(to[e] == p) {
			f = e;
			for(int i = 0; i < k; i ++) {
				dp[e][(i + 1) % k] = dp[e][(i + 1) % k] ^ d[p][i];
				dp[e][(i + 1) % k] = dp[e][(i + 1) % k] ^ dp[c][i];
				dp[e][(i + 2) % k] = dp[e][(i + 2) % k] ^ d[u][i];
			}
			dp[e][1 % k] ^= pre[p];
			dp[e][0] ^= pre[u];
//			cerr << dp[e][0] << ' ' << u << ' ' << p << ' ' << d[p][0] << ' ' << d[u][0] << ' ' << pre[p] << ' ' << pre[u] << '\n';
//			cerr << dp[e][0] << '\n';
		}
	}
	for(int e = fst[u]; e; e = nxt[e]) {
		if(to[e] == p) continue;
		int v = to[e];
		DFS_01(v, u, f);
	}
}

void DFS_02(int u, int p) {
	if(sum) rlt[u] = 1;
	for(int e = fst[u]; e; e = nxt[e]) {
		if(to[e] == p) continue;
		int v = to[e];
		sum ^= dp[e][0];
		sum ^= dp[REV(e)][0];
		sum ^= pre[u];
		sum ^= pre[v];
		DFS_02(v, u);
		sum ^= pre[u];
		sum ^= pre[v];
		sum ^= dp[e][0];
		sum ^= dp[REV(e)][0];
	}
}

int main() {
#ifndef ONLINE_JUDGE
//	freopen("I", "r", stdin);
//	freopen("O", "w", stdout);
#endif

	ios::sync_with_stdio(0);
	cin.tie(0), cout.tie(0);

	int i, u, v;
	cin >> n >> k;
	for(i = 1; i < n; i ++) {
		cin >> u >> v;
		add_edge(u, v, i);
		add_edge(v, u, i + n);
	}
	for(i = 1; i <= n; i ++) cin >> pre[i];
	dt[0] = -1;
	DFS(1, 0);
	DFS_00(1, 0);
	dp[0][0] = pre[1];
	DFS_01(1, 0, 0);
//	for(i = 0; i <= 2 * n; i ++) cerr << dp[i][0] << '\n';
	DFS_02(1, 0);
	for(i = 1; i <= n; i ++) cout << rlt[i] << ' ';

	return 0;

}

