package main
import (
"bufio"
"fmt"
"os"
)
func main() {
in := bufio.NewReader(os.Stdin)
var n int
fmt.Fscan(in, &n)
parent := make([]int, n+1)
typ := make([]int, n+1)
for i := 1; i <= n; i++ {
fmt.Fscan(in, &parent[i], &typ[i])
}
special_parent := make([]int, n+1)
part_parent := make([]int, n+1)
for i := 1; i <= n; i++ {
if parent[i] != -1 {
if typ[i] == 0 {
special_parent[i] = parent[i]
} else if typ[i] == 1 {
part_parent[i] = parent[i]
}
} else {
special_parent[i] = -1
part_parent[i] = -1
}
}
depth := make([]int, n+1)
for i := 1; i <= n; i++ {
if special_parent[i] == -1 {
depth[i] = 0
} else {
depth[i] = 1 + depth[special_parent[i]]
}
}
const LOG = 18
par := make([][]int, LOG)
for k := 0; k < LOG; k++ {
par[k] = make([]int, n+1)
}
for i := 1; i <= n; i++ {
par[0][i] = special_parent[i]
}
for k := 1; k < LOG; k++ {
for i := 1; i <= n; i++ {
mid := par[k-1][i]
if mid != -1 {
par[k][i] = par[k-1][mid]
} else {
par[k][i] = -1
}
}
}
attach := make([]int, n+1)
for i := 1; i <= n; i++ {
if part_parent[i] == -1 {
attach[i] = i
} else {
attach[i] = attach[part_parent[i]]
}
}
var q int
fmt.Fscan(in, &q)
for qi := 0; qi < q; qi++ {
var t, u, v int
fmt.Fscan(in, &t, &u, &v)
if u == v {
fmt.Println("NO")
continue
}
if t == 1 {
d := depth[v] - depth[u]
if d <= 0 {
fmt.Println("NO")
continue
}
anc := v
for k := 0; k < LOG; k++ {
if (d & (1 << k)) != 0 {
anc = par[k][anc]
if anc == -1 {
break
}
}
}
if anc == u {
fmt.Println("YES")
} else {
fmt.Println("NO")
}
} else {
xv := attach[v]
if xv == v {
fmt.Println("NO")
continue
}
if u == xv {
fmt.Println("YES")
continue
}
d := depth[u] - depth[xv]
if d <= 0 {
fmt.Println("NO")
continue
}
anc := u
for k := 0; k < LOG; k++ {
if (d & (1 << k)) != 0 {
anc = par[k][anc]
if anc == -1 {
break
}
}
}
if anc == xv {
fmt.Println("YES")
} else {
fmt.Println("NO")
}
}
}
}