← Home
For problem statement at 2000-2999/2000-2099/2060-2069/2064/problemE.txt this is a correct solution, but verifier at 2000-2999/2000-2099/2060-2069/2064/verifierE.go ends with reference runtime error on test 1 (sample): exit status 2
input:
4
1
1
1
1
5
3 4 1 2
1 1 1 1 1
5
4 2 3 1 5
2 1 4 1 5
40
29 15 20 35 37 31 27 1 32 36 38 25 22 8 16 7 3 28 11 12 23 4 14 9 39 13 10 30 6 2 24 17 19 5 34 18 33 26 40 21
3 1 2 2 1 2 3 1 1 1 1 2 1 3 1 1 3 1 1 1 2 2 1 3 3 3 2 3 2 2 2 2 1 3 2 1 1 2 2 2
output:
1
panic: runtime error: index out of range [5] with length 2

goroutine 1 [running]:
main.solveCase(0x1, {0x4000098050?, 0x40000a0f10?, 0x1?}, {0x4000098058, 0x1, 0x400003a668?})
	/home/ubuntu/codeforces/2000-2999/2000-2099/2060-2069/2064/2064E.go:140 +0x2e0
main.main()
	/home/ubuntu/codeforces/2000-2999/2000-2099/2060-2069/2064/2064E.go:183 +0x1d0
exit status 1 can you fix the verifier? ```go
package main

import (
	"bufio"
	"fmt"
	"os"
)

type Scanner struct {
	reader *bufio.Reader
}

func (s *Scanner) NextInt() int {
	var res int
	var c byte
	for {
		c, _ = s.reader.ReadByte()
		if c > ' ' {
			break
		}
		if c == 0 {
			return 0
		}
	}
	for {
		res = res*10 + int(c-'0')
		c, _ = s.reader.ReadByte()
		if c <= ' ' {
			break
		}
	}
	return res
}

func find(i int, parent []int) int {
	root := i
	for parent[root] != root {
		root = parent[root]
	}
	curr := i
	for parent[curr] != root {
		nxt := parent[curr]
		parent[curr] = root
		curr = nxt
	}
	return root
}

func unite(i, j int, parent, size []int) {
	rootI := find(i, parent)
	rootJ := find(j, parent)
	if rootI != rootJ {
		parent[rootI] = rootJ
		size[rootJ] += size[rootI]
	}
}

func main() {
	reader := bufio.NewReaderSize(os.Stdin, 65536)
	scanner := &Scanner{reader: reader}
	writer := bufio.NewWriterSize(os.Stdout, 65536)
	defer writer.Flush()

	t := scanner.NextInt()
	if t == 0 {
		return
	}

	for i := 0; i < t; i++ {
		n := scanner.NextInt()

		p := make([]int, n+1)
		x := make([]int, n+1)
		for j := 1; j <= n; j++ {
			p[j] = scanner.NextInt()
			x[p[j]] = j
		}

		cArr := make([]int, n+1)
		for j := 1; j <= n; j++ {
			cArr[j] = scanner.NextInt()
		}

		parent := make([]int, n+1)
		size := make([]int, n+1)
		for j := 0; j <= n; j++ {
			parent[j] = j
			size[j] = 1
		}

		for j := 1; j < n; j++ {
			if cArr[j] == cArr[j+1] {
				unite(j, j+1, parent, size)
			}
		}

		L := make([]int, n+2)
		R := make([]int, n+2)
		for j := 1; j <= n; j++ {
			L[j] = j - 1
			R[j] = j + 1
		}
		L[0] = 0
		R[n+1] = n + 1

		var ans int64 = 1
		var MOD int64 = 998244353

		for k := 1; k <= n; k++ {
			u := x[k]
			root := find(u, parent)
			currentSize := int64(size[root])
			ans = (ans * currentSize) % MOD

			size[root]--

			prev := L[u]
			next := R[u]

			if prev >= 1 {
				R[prev] = next
			}
			if next <= n {
				L[next] = prev
			}

			if prev >= 1 && next <= n && cArr[prev] == cArr[next] {
				unite(prev, next, parent, size)
			}
		}

		fmt.Fprintln(writer, ans)
	}
}
```