```go
package main
import (
"bufio"
"fmt"
"os"
"strconv"
)
func main() {
scanner := bufio.NewScanner(os.Stdin)
scanner.Split(bufio.ScanWords)
scanner.Scan()
n, _ := strconv.Atoi(scanner.Text())
val := make([]int, n+1)
left := make([]int, n+1)
right := make([]int, n+1)
isChild := make([]bool, n+1)
for i := 1; i <= n; i++ {
scanner.Scan()
v, _ := strconv.Atoi(scanner.Text())
scanner.Scan()
l, _ := strconv.Atoi(scanner.Text())
scanner.Scan()
r, _ := strconv.Atoi(scanner.Text())
val[i] = v
left[i] = l
right[i] = r
if l != -1 {
isChild[l] = true
}
if r != -1 {
isChild[r] = true
}
}
root := 1
for i := 1; i <= n; i++ {
if !isChild[i] {
root = i
break
}
}
type frame struct {
idx int
low int64
high int64
}
const INF int64 = 1 << 60
searchable := make(map[int]bool)
stack := []frame{{root, -INF, INF}}
for len(stack) > 0 {
f := stack[len(stack)-1]
stack = stack[:len(stack)-1]
v := int64(val[f.idx])
if f.low < v && v < f.high {
searchable[val[f.idx]] = true
}
if left[f.idx] != -1 {
stack = append(stack, frame{left[f.idx], f.low, min(f.high, v)})
}
if right[f.idx] != -1 {
stack = append(stack, frame{right[f.idx], max(f.low, v), f.high})
}
}
ans := 0
for i := 1; i <= n; i++ {
if !searchable[val[i]] {
ans++
}
}
fmt.Println(ans)
}
func min(a, b int64) int64 {
if a < b {
return a
}
return b
}
func max(a, b int64) int64 {
if a > b {
return a
}
return b
}
```