#include <bits/stdc++.h>   using namespace std;   typedef long long ll;   typedef long double ld;   typedef string str;      #define pb push_back   #define ppp pop_back   #define pii pair<int,int>   #define fi first   #define se second   #define stie std::tie   #define vec vector   #define forn(i, l, r) for (int i=l; i<=r; i++)   #define forb(i, r, l) for (int i=r; i>=l; i--)   #define emp empty   #define beg begin   #define ins insert   #define cle clear   #define era erase   #define que queue   #define pque priority_queue   #define mset multiset   #define deq deque   #define sta stack   #define con const   #define rsz resize   #define ass assign   #define lowb lower_bound   #define uppb upper_bound      template<class T> void mini(T& a, T b) { a = min(a, b); }   template<class T> void maxi(T& a, T b) { a = max(a, b); }   template<class T1, class T2> ostream& operator<<(ostream &out, pair<T1, T2> a) { return out << a.first <<     << a.second; }   template<class T> ostream& operator<<(ostream& out, vector<T> a) { for (auto& i : a) out << i <<    ; return out; }   template<class T> ostream& operator<<(ostream& out, set<T> a) { for (auto& i : a) out << i <<    ; return out; }   template<class T> ostream& operator<<(ostream& out, multiset<T> a) { for (auto& i : a) out << i <<    ; return out; }   template<class T1, class T2> ostream& operator<<(ostream& out, map<T1, T2> a) { for (auto& i : a) out << i <<   n ; return out; }   template<class T1, class T2> ostream& operator<<(ostream& out, unordered_map<T1, T2> a) { for (auto& i : a) out << i <<   n ; return out; }   template<class T> ostream& operator<<(ostream& out, queue<T> a) { while (!a.empty()) { out << a.front() <<    ; a.pop(); } return out; }   template<class T> ostream& operator<<(ostream& out, deque<T> a) { while (!a.empty()) { out << a.front() <<    ; a.pop_front(); } return out; }   template<class T> ostream& operator<<(ostream& out, priority_queue<T> a) { while (!a.empty()) { out << a.top() <<   n ; a.pop(); } return out; }   template<class T> void out(T a) { cout << a << endl; }   template<class T1, class T2> void out(T1 a, T2 b) { cout << a <<     << b << endl; }   template<class T1, class T2, class T3> void out(T1 a, T2 b, T3 c) { cout << a <<     << b <<     << c << endl; }   template<class T1, class T2, class T3, class T4> void out(T1 a, T2 b, T3 c, T4 d) { cout << a <<     << b <<     << c <<     << d << endl; }   template<class T> void out(vector<vector<T>> a) { for (vector<T> i : a) out(i); }   template<class T> void out_(T a[], int l, int r) { for (int i = l; i <= r; i++) cout << a[i] <<    ; cout << endl; }   void out() { cout <<  OK  << endl; }   template<class T> void sort(vector<T>& a) { sort(a.begin(), a.end()); }   template<class T> void uniq(vector<T>& a) { sort(a); a.erase(unique(a.begin(), a.end()), a.end()); }   template<class T> vector<T> set_int(vector<T> a, vector<T> b) { sort(a); sort(b); vector<T> res; set_intersection(a.begin(), a.end(), b.begin(), b.end(), back_inserter(res)); return res; }   clock_t start_time; void start_timer() { start_time = clock(); }   double get_time() { return (double)(clock() - start_time) / CLOCKS_PER_SEC; }   #if __SIZEOF_INT128__ >= 16   typedef __int128 LL;   istream& operator>>(istream& in, __int128& a) { int64_t b; cin >> b; a = b; return in; }   ostream& operator<<(ostream& out, const __int128 a) {    unsigned __int128 b = a < 0 ? -a : a; char buf[128]; char* c = end(buf); do { --c; *c =  0123456789 [b % 10]; b /= 10; } while (b);    if (a < 0) { --c; *c =  - ; } int len = end(buf) - c; out.rdbuf()->sputn(c, len); return out;   }   #endif      con int N = 1e5 + 5;   con int K = 25;      int a[N];   vec<int> g[N];   int dp[N][2 * K];   bool ans[N];   int k;      void dfs(int v = 1, int p = 0) {    dp[v][0] = a[v];    for (int u : g[v]) {     if (u == p) continue;     dfs(u, v);     forn(i, 1, k-1) {      dp[v][i] ^= dp[u][i-1];     }     dp[v][0] ^= dp[u][k-1];    }   }      void dfs2(int v = 1, int p = 0, vec<int> cur = vec<int>(2 * K, 0)) {    forn(i, 0, k-1) {     cur[i] ^= dp[v][i];    }    int odd = 0;    forn(i, k/2, k-1) {     odd ^= cur[i];    }    ans[v] = odd;    for (int u : g[v]) {     if (u == p) continue;     vec<int> nxt = cur;     forn(i, 1, k-1) {      nxt[i] ^= dp[u][i-1];     }     nxt[0] ^= dp[u][k-1];     int last = nxt[k-1];     forb(i, k-1, 1) {      nxt[i] = nxt[i-1];     }     nxt[0] = last;     dfs2(u, v, nxt);    }   }      void Solve() {    int n;    cin >> n >> k;    k *= 2;    forn(i, 1, n-1) {     int u, v;     cin >> u >> v;     g[u].pb(v);     g[v].pb(u);    }    forn(i, 1, n) cin >> a[i];    dfs();    dfs2();    forn(i, 1, n) {     cout << ans[i] <<    ;    }    cout <<   n ;   }      int main() {    ios_base::sync_with_stdio(0); cin.tie(0);   #ifdef LOCAL    freopen( input.txt ,  r , stdin);   #endif    start_timer();    Solve();    return 0;   }