```go
package main
import (
"bufio"
"fmt"
"os"
)
func readInt(reader *bufio.Reader) int64 {
var res int64
var sign int64 = 1
for {
b, err := reader.ReadByte()
if err != nil {
return 0
}
if b == '-' {
sign = -1
break
}
if b >= '0' && b <= '9' {
res = int64(b - '0')
break
}
}
for {
b, err := reader.ReadByte()
if err != nil || b < '0' || b > '9' {
break
}
res = res*10 + int64(b-'0')
}
return res * sign
}
func main() {
reader := bufio.NewReader(os.Stdin)
n := int(readInt(reader))
b := make([]int64, n+1)
for i := 1; i <= n; i++ {
b[i] = readInt(reader)
}
a := make([]int64, n+1)
for i := 1; i <= n; i++ {
a[i] = readInt(reader)
}
x := make([]int, n+1)
k := make([]int64, n+1)
for i := 2; i <= n; i++ {
x[i] = int(readInt(reader))
k[i] = readInt(reader)
}
D := make([]int64, n+1)
for i := 1; i <= n; i++ {
D[i] = b[i] - a[i]
}
const INF int64 = 1000000000000000000
for i := n; i >= 2; i-- {
if D[i] > 0 {
D[x[i]] += D[i]
} else if D[i] < 0 {
def := -D[i]
if k[i] != 0 && def > INF/k[i] {
D[x[i]] = -INF
} else {
sub := def * k[i]
if D[x[i]] < -INF+sub {
D[x[i]] = -INF
} else {
D[x[i]] -= sub
}
}
}
}
if D[1] >= 0 {
fmt.Println("YES")
} else {
fmt.Println("NO")
}
}
```