← Home
For problem statement at 0-999/300-399/330-339/339/problemE.txt this is a correct solution, but verifier at 0-999/300-399/330-339/339/verifierE.go ends with All 100 tests passed can you fix the verifier? ```go
package main

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

type Command struct {
	l, r int
}

var n int
var A []int
var ans []Command
var found bool

func abs(x int) int {
	if x < 0 {
		return -x
	}
	return x
}

func findBreaks(A []int) []int {
	var C []int
	for i := 1; i <= n+1; i++ {
		if abs(A[i]-A[i-1]) != 1 {
			C = append(C, i)
		}
	}
	return C
}

func isSorted(A []int) bool {
	for i := 1; i <= n; i++ {
		if A[i] != i {
			return false
		}
	}
	return true
}

func rev(A []int, l, r int) {
	for i, j := l, r; i < j; i, j = i+1, j-1 {
		A[i], A[j] = A[j], A[i]
	}
}

func getCandidates(A []int, C []int) []Command {
	candsMap := make(map[int]bool)
	var cands []Command

	addCand := func(l, r int) {
		if l >= 1 && r <= n && l < r {
			key := l*2000 + r
			if !candsMap[key] {
				candsMap[key] = true
				cands = append(cands, Command{l, r})
			}
		}
	}

	for i := 0; i < len(C); i++ {
		for j := i+1; j < len(C); j++ {
			addCand(C[i], C[j]-1)
		}
	}

	for _, c := range C {
		if c >= 1 && c <= n {
			t1, t2 := A[c-1]+1, A[c-1]-1
			for r := c; r <= n; r++ {
				if A[r] == t1 || A[r] == t2 {
					addCand(c, r)
				}
			}
		}
		if c-1 >= 1 && c-1 <= n {
			t3, t4 := A[c]+1, A[c]-1
			for l := 1; l <= c-1; l++ {
				if A[l] == t3 || A[l] == t4 {
					addCand(l, c-1)
				}
			}
		}
	}
	return cands
}

func dfs(depth int, maxDepth int) {
	if found {
		return
	}
	if isSorted(A) {
		found = true
		return
	}
	if depth == maxDepth {
		return
	}

	C := findBreaks(A)
	if len(C) > (maxDepth-depth)*2 {
		return
	}

	if maxDepth-depth == 1 {
		if len(C) == 2 {
			l, r := C[0], C[1]-1
			if l < r {
				rev(A, l, r)
				if isSorted(A) {
					ans = append(ans, Command{l, r})
					found = true
					return
				}
				rev(A, l, r)
			}
		}
		return
	}

	cands := getCandidates(A, C)
	for _, cand := range cands {
		l, r := cand.l, cand.r
		rev(A, l, r)
		ans = append(ans, Command{l, r})
		dfs(depth+1, maxDepth)
		if found {
			return
		}
		ans = ans[:len(ans)-1]
		rev(A, l, r)
	}
}

func main() {
	reader := bufio.NewReader(os.Stdin)
	fmt.Fscan(reader, &n)
	A = make([]int, n+2)
	A[0] = 0
	A[n+1] = n + 1
	for i := 1; i <= n; i++ {
		fmt.Fscan(reader, &A[i])
	}

	for maxDepth := 0; maxDepth <= 3; maxDepth++ {
		dfs(0, maxDepth)
		if found {
			fmt.Println(len(ans))
			for i := len(ans) - 1; i >= 0; i-- {
				fmt.Printf("%d %d\n", ans[i].l, ans[i].r)
			}
			return
		}
	}
}
```