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

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

const INF = 1000000000

type Node struct {
	min1 [9]int
	min2 [9]int
}

var tree []Node
var n int

func merge(left, right Node) Node {
	var res Node
	for p := 0; p < 9; p++ {
		a, b := left.min1[p], left.min2[p]
		c, d := right.min1[p], right.min2[p]
		if a <= c {
			res.min1[p] = a
			if b <= c {
				res.min2[p] = b
			} else {
				res.min2[p] = c
			}
		} else {
			res.min1[p] = c
			if d <= a {
				res.min2[p] = d
			} else {
				res.min2[p] = a
			}
		}
	}
	return res
}

func initTree(size int) {
	n = size
	tree = make([]Node, 2*n)
	for i := 0; i < 2*n; i++ {
		for p := 0; p < 9; p++ {
			tree[i].min1[p] = INF
			tree[i].min2[p] = INF
		}
	}
}

func build(a []int) {
	for i := 0; i < n; i++ {
		val := a[i]
		idx := i + n
		temp := val
		for p := 0; p < 9; p++ {
			if temp%10 != 0 {
				tree[idx].min1[p] = val
			}
			temp /= 10
		}
	}
	for i := n - 1; i > 0; i-- {
		tree[i] = merge(tree[2*i], tree[2*i+1])
	}
}

func update(idx, val int) {
	idx += n
	for p := 0; p < 9; p++ {
		tree[idx].min1[p] = INF
		tree[idx].min2[p] = INF
	}
	temp := val
	for p := 0; p < 9; p++ {
		if temp%10 != 0 {
			tree[idx].min1[p] = val
		}
		temp /= 10
	}
	idx /= 2
	for idx > 0 {
		tree[idx] = merge(tree[2*idx], tree[2*idx+1])
		idx /= 2
	}
}

func query(l, r int) int {
	l += n
	r += n

	var resL, resR Node
	for p := 0; p < 9; p++ {
		resL.min1[p] = INF
		resL.min2[p] = INF
		resR.min1[p] = INF
		resR.min2[p] = INF
	}

	for l <= r {
		if l%2 == 1 {
			resL = merge(resL, tree[l])
			l++
		}
		if r%2 == 0 {
			resR = merge(tree[r], resR)
			r--
		}
		l /= 2
		r /= 2
	}

	finalRes := merge(resL, resR)

	ans := 2*INF + 1
	for p := 0; p < 9; p++ {
		if finalRes.min2[p] != INF {
			sum := finalRes.min1[p] + finalRes.min2[p]
			if sum < ans {
				ans = sum
			}
		}
	}

	if ans >= 2*INF {
		return -1
	}
	return ans
}

var buffer []byte
var bufPtr int

func readInt() int {
	for bufPtr < len(buffer) && buffer[bufPtr] <= ' ' {
		bufPtr++
	}
	if bufPtr >= len(buffer) {
		return 0
	}
	res := 0
	for bufPtr < len(buffer) && buffer[bufPtr] > ' ' {
		res = res*10 + int(buffer[bufPtr]-'0')
		bufPtr++
	}
	return res
}

func main() {
	buffer, _ = io.ReadAll(os.Stdin)

	nVal := readInt()
	mVal := readInt()
	if nVal == 0 {
		return
	}

	initTree(nVal)

	a := make([]int, nVal)
	for i := 0; i < nVal; i++ {
		a[i] = readInt()
	}
	build(a)

	out := bufio.NewWriter(os.Stdout)
	defer out.Flush()

	for i := 0; i < mVal; i++ {
		type_ := readInt()
		if type_ == 1 {
			idx := readInt() - 1
			val := readInt()
			update(idx, val)
		} else {
			l := readInt() - 1
			r := readInt() - 1
			ans := query(l, r)
			fmt.Fprintln(out, ans)
		}
	}
}