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)
}
}
}