← Home
For problem statement at 0-999/800-899/880-889/889/problemE.txt this is a correct solution, but verifier at 0-999/800-899/880-889/889/verifierE.go ends with test 129 (medium_rand_3) failed: expect 3240841, got 3312031
input:
25
973042 735652 806497 147818 442722 505453 621752 493937 308119 471657 47610 6440 225058 579819 780599 435167 335108 836960 804182 654287 613825 291061 73984 203116 222337


exit status 1 can you fix the verifier? ```go
package main

import (
	"fmt"
	"io"
	"os"
)

func main() {
	buf, _ := io.ReadAll(os.Stdin)
	var pos int

	readInt := func() int64 {
		for pos < len(buf) && buf[pos] <= ' ' {
			pos++
		}
		if pos >= len(buf) {
			return 0
		}
		var res int64
		for pos < len(buf) && buf[pos] > ' ' {
			res = res*10 + int64(buf[pos]-'0')
			pos++
		}
		return res
	}

	n := int(readInt())
	if n == 0 {
		return
	}

	a := make([]int64, n)
	for i := 0; i < n; i++ {
		a[i] = readInt()
	}

	var b []int64
	var c []int64
	minA := int64(2e18)
	lastIdx := -1

	for i := 0; i < n; i++ {
		if a[i] < minA {
			if lastIdx != -1 {
				c = append(c, int64(i-lastIdx))
			}
			b = append(b, a[i])
			minA = a[i]
			lastIdx = i
		}
	}
	c = append(c, int64(n-lastIdx))

	m := len(b)
	S := make([]int64, m)
	S[0] = c[0]
	for i := 1; i < m; i++ {
		S[i] = S[i-1] + c[i]
	}

	memo := make(map[int64]int64)

	var solve func(v int64) int64
	solve = func(v int64) int64 {
		if val, ok := memo[v]; ok {
			return val
		}

		left, right := 0, m
		for left < right {
			mid := int(uint(left+right) >> 1)
			if b[mid] <= v {
				right = mid
			} else {
				left = mid + 1
			}
		}
		j := left

		if j == m {
			res := S[m-1] * v
			memo[v] = res
			return res
		}

		q1 := v / b[j]
		r1 := v % b[j]
		res1 := S[j-1]*q1*b[j] + solve(r1)

		q2 := q1 - 1
		r2 := b[j] - 1
		res2 := S[j-1]*q2*b[j] + solve(r2)

		if res2 > res1 {
			res1 = res2
		}

		memo[v] = res1
		return res1
	}

	ans := solve(b[0] - 1)
	fmt.Println(ans)
}
```