← Home
package main

import (
	"bytes"
	"io"
	"os"
)

func main() {
	data, _ := io.ReadAll(os.Stdin)
	idx := 0
	readInt := func() int {
		for data[idx] < '0' || data[idx] > '9' {
			idx++
		}
		val := 0
		for idx < len(data) && data[idx] >= '0' && data[idx] <= '9' {
			val = val*10 + int(data[idx]-'0')
			idx++
		}
		return val
	}

	n := readInt()

	head := make([]int, n+1)
	for i := 1; i <= n; i++ {
		head[i] = -1
	}

	m := 2 * (n - 1)
	to := make([]int, m)
	next := make([]int, m)
	edgeIdx := 0

	for i := 0; i < n-1; i++ {
		a := readInt()
		b := readInt()

		to[edgeIdx] = b
		next[edgeIdx] = head[a]
		head[a] = edgeIdx
		edgeIdx++

		to[edgeIdx] = a
		next[edgeIdx] = head[b]
		head[b] = edgeIdx
		edgeIdx++
	}

	parent := make([]int, n+1)
	tin := make([]int, n+1)
	tout := make([]int, n+1)

	stack := make([]int, 0, 2*n)
	stack = append(stack, 1)
	timer := 0

	for len(stack) > 0 {
		v := stack[len(stack)-1]
		stack = stack[:len(stack)-1]

		if v > 0 {
			tin[v] = timer
			timer++
			stack = append(stack, -v)

			for e := head[v]; e != -1; e = next[e] {
				u := to[e]
				if u == parent[v] {
					continue
				}
				parent[u] = v
				stack = append(stack, u)
			}
		} else {
			v = -v
			tout[v] = timer - 1
		}
	}

	size := 1
	for size < n {
		size <<= 1
	}

	fillSeg := make([]int, size<<1)
	emptySeg := make([]int, size<<1)

	rangeAssign := func(l, r, t int) {
		l += size
		r += size
		for l <= r {
			if l&1 == 1 {
				fillSeg[l] = t
				l++
			}
			if r&1 == 0 {
				fillSeg[r] = t
				r--
			}
			l >>= 1
			r >>= 1
		}
	}

	pointQuery := func(p int) int {
		res := 0
		for p += size; p > 0; p >>= 1 {
			if fillSeg[p] > res {
				res = fillSeg[p]
			}
		}
		return res
	}

	pointSet := func(p, t int) {
		for p += size; p > 0; p >>= 1 {
			emptySeg[p] = t
		}
	}

	rangeMax := func(l, r int) int {
		res := 0
		l += size
		r += size
		for l <= r {
			if l&1 == 1 {
				if emptySeg[l] > res {
					res = emptySeg[l]
				}
				l++
			}
			if r&1 == 0 {
				if emptySeg[r] > res {
					res = emptySeg[r]
				}
				r--
			}
			l >>= 1
			r >>= 1
		}
		return res
	}

	q := readInt()
	var out bytes.Buffer
	out.Grow(q * 2)

	for t := 1; t <= q; t++ {
		c := readInt()
		v := readInt()

		if c == 1 {
			rangeAssign(tin[v], tout[v], t)
		} else if c == 2 {
			pointSet(tin[v], t)
		} else {
			if pointQuery(tin[v]) > rangeMax(tin[v], tout[v]) {
				out.WriteByte('1')
			} else {
				out.WriteByte('0')
			}
			out.WriteByte('\n')
		}
	}

	os.Stdout.Write(out.Bytes())
}