← Home
For problem statement at 0-999/700-799/750-759/750/problemE.txt this is a correct solution, but verifier at 0-999/700-799/750-759/750/verifierE.go ends with all tests passed can you fix the verifier? package main

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

const INF int32 = 1 << 30

type Matrix [25]int32

var baseInf Matrix
var id Matrix
var mats [10]Matrix

func makeMatrix(c byte) Matrix {
	m := baseInf
	for i := 0; i < 5; i++ {
		m[i*5+i] = 1
	}
	for i := 0; i < 5; i++ {
		ok := true
		j := i
		switch i {
		case 0:
			if c == '2' {
				j = 1
			}
		case 1:
			if c == '0' {
				j = 2
			}
		case 2:
			if c == '1' {
				j = 3
			}
		case 3:
			if c == '6' {
				ok = false
			} else if c == '7' {
				j = 4
			}
		case 4:
			if c == '6' {
				ok = false
			}
		}
		if ok {
			m[i*5+j] = 0
		}
	}
	return m
}

func mul(a, b *Matrix) Matrix {
	c := baseInf
	for i := 0; i < 5; i++ {
		ri := i * 5
		for k := i; k < 5; k++ {
			best := INF
			for j := i; j <= k; j++ {
				av := (*a)[ri+j]
				bv := (*b)[j*5+k]
				if av == INF || bv == INF {
					continue
				}
				v := av + bv
				if v < best {
					best = v
				}
			}
			c[ri+k] = best
		}
	}
	return c
}

func init() {
	for i := 0; i < 25; i++ {
		baseInf[i] = INF
	}
	id = baseInf
	for i := 0; i < 5; i++ {
		id[i*5+i] = 0
	}
	for d := 0; d < 10; d++ {
		mats[d] = makeMatrix(byte('0' + d))
	}
}

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

func (fs *FastScanner) skip() {
	for fs.idx < fs.n && fs.data[fs.idx] <= ' ' {
		fs.idx++
	}
}

func (fs *FastScanner) nextInt() int {
	fs.skip()
	val := 0
	for fs.idx < fs.n {
		c := fs.data[fs.idx]
		if c <= ' ' {
			break
		}
		val = val*10 + int(c-'0')
		fs.idx++
	}
	return val
}

func (fs *FastScanner) nextToken() []byte {
	fs.skip()
	start := fs.idx
	for fs.idx < fs.n && fs.data[fs.idx] > ' ' {
		fs.idx++
	}
	return fs.data[start:fs.idx]
}

func main() {
	data, _ := io.ReadAll(os.Stdin)
	fs := FastScanner{data: data, n: len(data)}

	n := fs.nextInt()
	q := fs.nextInt()
	s := fs.nextToken()

	size := 1
	for size < n {
		size <<= 1
	}

	tree := make([]Matrix, size<<1)
	for i := size; i < size<<1; i++ {
		tree[i] = id
	}
	for i := 0; i < n; i++ {
		tree[size+i] = mats[s[i]-'0']
	}
	for i := size - 1; i > 0; i-- {
		tree[i] = mul(&tree[i<<1], &tree[i<<1|1])
	}

	out := make([]byte, 0, q*8)
	for ; q > 0; q-- {
		l := fs.nextInt() - 1 + size
		r := fs.nextInt() + size

		left := id
		right := id

		for l < r {
			if l&1 == 1 {
				left = mul(&left, &tree[l])
				l++
			}
			if r&1 == 1 {
				r--
				right = mul(&tree[r], &right)
			}
			l >>= 1
			r >>= 1
		}

		res := mul(&left, &right)
		ans := res[4]
		if ans == INF {
			out = strconv.AppendInt(out, -1, 10)
		} else {
			out = strconv.AppendInt(out, int64(ans), 10)
		}
		out = append(out, '\n')
	}

	os.Stdout.Write(out)
}