package main
import (
"bufio"
"io"
"os"
"strconv"
)
type Item struct {
v int
rem int
}
func main() {
data, _ := io.ReadAll(os.Stdin)
idx := 0
readInt := func() int {
for idx < len(data) && (data[idx] < '0' || data[idx] > '9') && data[idx] != '-' {
idx++
}
sign := 1
if data[idx] == '-' {
sign = -1
idx++
}
n := 0
for idx < len(data) && data[idx] >= '0' && data[idx] <= '9' {
n = n*10 + int(data[idx]-'0')
idx++
}
return sign * n
}
n := readInt()
m := readInt()
children := make([][]int, n+1)
for i := 2; i <= n; i++ {
p := readInt()
children[p] = append(children[p], i)
}
init := make([]int, n+1)
for i := 1; i <= n; i++ {
init[i] = -1
}
for i := 0; i < m; i++ {
x := readInt()
y := readInt()
if y > init[x] {
init[x] = y
}
}
stack := make([]Item, 1, n)
stack[0] = Item{1, -1}
ans := 0
for len(stack) > 0 {
it := stack[len(stack)-1]
stack = stack[:len(stack)-1]
rem := it.rem
if init[it.v] > rem {
rem = init[it.v]
}
if rem >= 0 {
ans++
}
nextRem := rem - 1
for _, ch := range children[it.v] {
stack = append(stack, Item{ch, nextRem})
}
}
w := bufio.NewWriter(os.Stdout)
w.WriteString(strconv.Itoa(ans))
w.WriteByte('\n')
w.Flush()
}