← Home
```go
package main

import (
	"bufio"
	"fmt"
	"os"
)

func main() {
	reader := bufio.NewReader(os.Stdin)
	writer := bufio.NewWriter(os.Stdout)
	defer writer.Flush()

	var n int
	if _, err := fmt.Fscan(reader, &n); err != nil {
		return
	}

	c := make([]int, n+1)
	tot := 0
	for i := 1; i <= n; i++ {
		fmt.Fscan(reader, &c[i])
		if c[i] == 1 {
			tot++
		}
	}

	adj := make([][]int, n+1)
	for i := 0; i < n-1; i++ {
		var u, v int
		fmt.Fscan(reader, &u, &v)
		adj[u] = append(adj[u], v)
		adj[v] = append(adj[v], u)
	}

	W0 := make([]bool, n+1)
	for i := 1; i <= n; i++ {
		if c[i] == 1 {
			W0[i] = true
			for _, v := range adj[i] {
				W0[v] = true
			}
		}
	}

	if tot < 2 {
		for i := 1; i <= n; i++ {
			if i > 1 {
				fmt.Fprint(writer, " ")
			}
			fmt.Fprint(writer, "0")
		}
		fmt.Fprintln(writer)
		return
	}

	if tot == 2 {
		for i := 1; i <= n; i++ {
			if i > 1 {
				fmt.Fprint(writer, " ")
			}
			if W0[i] {
				fmt.Fprint(writer, "1")
			} else {
				fmt.Fprint(writer, "0")
			}
		}
		fmt.Fprintln(writer)
		return
	}

	sz := make([]int, n+1)
	maxBranch := make([]int, n+1)

	order := make([]int, 0, n)
	qBFS := []int{1}
	visitedBFS := make([]bool, n+1)
	visitedBFS[1] = true
	parent := make([]int, n+1)

	for len(qBFS) > 0 {
		u := qBFS[0]
		qBFS = qBFS[1:]
		order = append(order, u)
		for _, v := range adj[u] {
			if !visitedBFS[v] {
				visitedBFS[v] = true
				parent[v] = u
				qBFS = append(qBFS, v)
			}
		}
	}

	for i := n - 1; i >= 0; i-- {
		u := order[i]
		sz[u] = c[u]
		for _, v := range adj[u] {
			if v != parent[u] {
				sz[u] += sz[v]
				if sz[v] > maxBranch[u] {
					maxBranch[u] = sz[v]
				}
			}
		}
		up := tot - sz[u]
		if up > maxBranch[u] {
			maxBranch[u] = up
		}
	}

	inK := make([]bool, n+1)
	K_intersect_W0 := false
	for i := 1; i <= n; i++ {
		if maxBranch[i] <= tot-2 {
			inK[i] = true
			if W0[i] {
				K_intersect_W0 = true
			}
		}
	}

	if K_intersect_W0 {
		for i := 1; i <= n; i++ {
			if i > 1 {
				fmt.Fprint(writer, " ")
			}
			fmt.Fprint(writer, "1")
		}
		fmt.Fprintln(writer)
		return
	}

	win := make([]bool, n+1)
	visited := make([]bool, n+1)
	q := make([]int, 0)

	for i := 1; i <= n; i++ {
		if inK[i] {
			visited[i] = true
			q = append(q, i)
		}
	}

	for len(q) > 0 {
		u := q[0]
		q = q[1:]

		for _, v := range adj[u] {
			if !visited[v] {
				visited[v] = true
				win[v] = W0[v] || win[u]
				q = append(q, v)
			}
		}
	}

	for i := 1; i <= n; i++ {
		if i > 1 {
			fmt.Fprint(writer, " ")
		}
		if inK[i] {
			fmt.Fprint(writer, "0")
		} else {
			if win[i] {
				fmt.Fprint(writer, "1")
			} else {
				fmt.Fprint(writer, "0")
			}
		}
	}
	fmt.Fprintln(writer)
}
```