← Home
```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")
	}
}
```