← Home
For problem statement at 1000-1999/1200-1299/1210-1219/1218/problemH.txt this is a correct solution, but verifier at 1000-1999/1200-1299/1210-1219/1218/verifierH.go ends with all tests passed can you fix the verifier? ```go
package main

import (
	"bufio"
	"io"
	"os"
	"strconv"
)

type FastScanner struct {
	data []byte
	idx  int
	n    int
}

func NewFastScanner() *FastScanner {
	data, _ := io.ReadAll(os.Stdin)
	return &FastScanner{data: data, n: len(data)}
}

func (fs *FastScanner) NextInt() int {
	for fs.idx < fs.n && fs.data[fs.idx] <= ' ' {
		fs.idx++
	}
	val := 0
	for fs.idx < fs.n && fs.data[fs.idx] > ' ' {
		val = val*10 + int(fs.data[fs.idx]-'0')
		fs.idx++
	}
	return val
}

func (fs *FastScanner) NextInt64() int64 {
	for fs.idx < fs.n && fs.data[fs.idx] <= ' ' {
		fs.idx++
	}
	var val int64
	for fs.idx < fs.n && fs.data[fs.idx] > ' ' {
		val = val*10 + int64(fs.data[fs.idx]-'0')
		fs.idx++
	}
	return val
}

func lowerBound(a []int, x int) int {
	l, r := 0, len(a)
	for l < r {
		m := int(uint(l+r) >> 1)
		if a[m] < x {
			l = m + 1
		} else {
			r = m
		}
	}
	return l
}

func upperBound64(a []int, x int64) int {
	l, r := 0, len(a)
	for l < r {
		m := int(uint(l+r) >> 1)
		if int64(a[m]) <= x {
			l = m + 1
		} else {
			r = m
		}
	}
	return l
}

type Frame struct {
	u   int
	idx int
}

func main() {
	fs := NewFastScanner()

	n := fs.NextInt()
	a := make([]int, n+1)
	indeg := make([]int, n+1)

	for i := 1; i <= n; i++ {
		v := fs.NextInt()
		a[i] = v
		indeg[v]++
	}

	rev := make([][]int, n+1)
	for i := 1; i <= n; i++ {
		rev[i] = make([]int, indeg[i])
	}
	ptr := make([]int, n+1)
	for i := 1; i <= n; i++ {
		v := a[i]
		rev[v][ptr[v]] = i
		ptr[v]++
	}

	queue := make([]int, n)
	head, tail := 0, 0
	for i := 1; i <= n; i++ {
		if indeg[i] == 0 {
			queue[tail] = i
			tail++
		}
	}
	for head < tail {
		u := queue[head]
		head++
		v := a[u]
		indeg[v]--
		if indeg[v] == 0 {
			queue[tail] = v
			tail++
		}
	}

	isCycle := make([]bool, n+1)
	for i := 1; i <= n; i++ {
		if indeg[i] > 0 {
			isCycle[i] = true
		}
	}

	visitedCycle := make([]bool, n+1)
	comp := make([]int, n+1)
	dep := make([]int, n+1)
	rootPos := make([]int, n+1)
	roots := make([]int, 0)
	compLen := make([]int, 0)
	compResidues := make([][][]int, 0)

	head, tail = 0, 0
	for i := 1; i <= n; i++ {
		if isCycle[i] && !visitedCycle[i] {
			cycle := make([]int, 0)
			u := i
			for !visitedCycle[u] {
				visitedCycle[u] = true
				cycle = append(cycle, u)
				u = a[u]
			}
			cid := len(compLen)
			c := len(cycle)
			compLen = append(compLen, c)
			res := make([][]int, c)
			for p, u := range cycle {
				comp[u] = cid
				rootPos[u] = p
				r := (c - p) % c
				res[r] = append(res[r], 0)
				roots = append(roots, u)
				queue[tail] = u
				tail++
			}
			compResidues = append(compResidues, res)
		}
	}

	maxDepth := 0
	for head < tail {
		u := queue[head]
		head++
		for _, v := range rev[u] {
			if isCycle[v] {
				continue
			}
			comp[v] = comp[u]
			dep[v] = dep[u] + 1
			if dep[v] > maxDepth {
				maxDepth = dep[v]
			}
			rootPos[v] = rootPos[u]
			cid := comp[v]
			c := compLen[cid]
			r := dep[v] - rootPos[v]
			r %= c
			if r < 0 {
				r += c
			}
			compResidues[cid][r] = append(compResidues[cid][r], dep[v])
			queue[tail] = v
			tail++
		}
	}

	tin := make([]int, n+1)
	tout := make([]int, n+1)
	depthBins := make([][]int, maxDepth+1)
	timer := 0
	stack := make([]Frame, 0)

	for _, r := range roots {
		stack = stack[:0]
		stack = append(stack, Frame{u: r, idx: -1})
		for len(stack) > 0 {
			top := &stack[len(stack)-1]
			u := top.u
			if top.idx == -1 {
				timer++
				tin[u] = timer
				depthBins[dep[u]] = append(depthBins[dep[u]], timer)
				top.idx = 0
			}
			if top.idx < len(rev[u]) {
				v := rev[u][top.idx]
				top.idx++
				if isCycle[v] {
					continue
				}
				stack = append(stack, Frame{u: v, idx: -1})
			} else {
				tout[u] = timer
				stack = stack[:len(stack)-1]
			}
		}
	}

	q := fs.NextInt()
	out := make([]byte, 0, q*8)

	for i := 0; i < q; i++ {
		m := fs.NextInt64()
		y := fs.NextInt()
		ans := 0

		if !isCycle[y] {
			if int64(dep[y])+m <= int64(maxDepth) {
				target := dep[y] + int(m)
				list := depthBins[target]
				l := lowerBound(list, tin[y])
				r := lowerBound(list, tout[y]+1)
				ans = r - l
			}
		} else {
			cid := comp[y]
			c := compLen[cid]
			py := rootPos[y]
			r := int((m%int64(c) - int64(py) + int64(c)) % int64(c))
			ans = upperBound64(compResidues[cid][r], m)
		}

		out = strconv.AppendInt(out, int64(ans), 10)
		out = append(out, '\n')
	}

	w := bufio.NewWriterSize(os.Stdout, 1<<20)
	w.Write(out)
	w.Flush()
}
```