voidinsert(int o, int lst, int v){ for (int i = 31; i >= 0; i--) { sum[o] = sum[lst] + 1; int c = ((v >> i) & 1); if (!ch[o][c])ch[o][c] = ++tot; ch[o][c ^ 1] = ch[lst][c ^ 1]; o = ch[o][c]; lst = ch[lst][c]; } sum[o] = sum[lst] + 1; } } T;
voiddfs(int u, int _fa){ T.rt[u] = ++T.tot; T.insert(T.rt[u], T.rt[_fa], a[u]); for (int v: G[u]) { if (v == _fa)continue; dfs(v, u); } }
intqry(int u, int q){ int o = T.rt[u]; int v = a[u]; int res = 0; if (T.sum[o] < q)return-1; for (int i = 31; i >= 0; i--) { int c = (v >> i) & 1; if (T.sum[T.ch[o][c ^ 1]] >= q) { res |= (1 << i); o = T.ch[o][c ^ 1]; } else { q -= T.sum[T.ch[o][c ^ 1]]; o = T.ch[o][c]; } } return res; }
priority_queue<pii> q; int cnt[N];
intmain(){ scanf("%d%d", &n, &k); for (int i = 1; i < n; i++) { int u, v; scanf("%d%d", &u, &v); G[u].push_back(v); G[v].push_back(u); } for (int i = 1; i <= n; i++)scanf("%d", &a[i]);
dfs(1, 0); for (int i = 1; i <= n; i++) { q.push({qry(i, 1), i}); cnt[i] = 1; } for (int i = 1; i <= k; i++) { int u = q.top().second, val = q.top().first; q.pop(); printf("%d\n", val); cnt[u]++; int nv = qry(u, cnt[u]); if (nv != -1)q.push({nv, u}); } return0; }