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())
}