Use this to learn the idea, then write your own version.
1package main2 3import (4 "bufio"5 . "fmt"6 "io"7 "math/bits"8)9 1011var todoInit94 [10]int12 13func init() {14 for i := range todoInit94 {15 todoInit94[i] = i16 }17}18 19type seg94 []struct {20 l, r int21 sum [10]int22 todo [10]int23}24 25func (seg94) mergeInfo(a, b [10]int) [10]int {26 for i := range a {27 a[i] += b[i]28 }29 return a30}31 32func (t seg94) do(O int, trans [10]int) {33 o := &t[O]34 s := [10]int{}35 for i, t := range trans {36 s[t] += o.sum[i]37 }38 o.sum = s39 for i := range trans {40 o.todo[i] = trans[o.todo[i]]41 }42}43 44func (t seg94) spread(o int) {45 if v := t[o].todo; v != todoInit94 {46 t.do(o<<1, v)47 t.do(o<<1|1, v)48 t[o].todo = todoInit9449 }50}51 52func (t seg94) build(a []int, o, l, r int) {53 t[o].l, t[o].r, t[o].todo = l, r, todoInit9454 if l == r {55 v := a[l-1]56 for i := 1; i <= v; i *= 10 {57 t[o].sum[v/i%10] += i58 }59 return60 }61 m := (l + r) >> 162 t.build(a, o<<1, l, m)63 t.build(a, o<<1|1, m+1, r)64 t.maintain(o)65}66 67func (t seg94) update(o, l, r, x, y int) {68 if l <= t[o].l && t[o].r <= r {69 v := todoInit9470 v[x] = y71 t.do(o, v)72 return73 }74 t.spread(o)75 m := (t[o].l + t[o].r) >> 176 if l <= m {77 t.update(o<<1, l, r, x, y)78 }79 if m < r {80 t.update(o<<1|1, l, r, x, y)81 }82 t.maintain(o)83}84 85func (t seg94) maintain(o int) {86 t[o].sum = t.mergeInfo(t[o<<1].sum, t[o<<1|1].sum)87}88 89func (t seg94) query(o, l, r int) [10]int {90 if l <= t[o].l && t[o].r <= r {91 return t[o].sum92 }93 t.spread(o)94 m := (t[o].l + t[o].r) >> 195 if r <= m {96 return t.query(o<<1, l, r)97 }98 if l > m {99 return t.query(o<<1|1, l, r)100 }101 return t.mergeInfo(t.query(o<<1, l, r), t.query(o<<1|1, l, r))102}103 104func cf794F(_r io.Reader, _w io.Writer) {105 in := bufio.NewReader(_r)106 out := bufio.NewWriter(_w)107 defer out.Flush()108 109 var n, q, op, l, r, x, y int110 Fscan(in, &n, &q)111 a := make([]int, n)112 for i := range a {113 Fscan(in, &a[i])114 }115 t := make(seg94, 2<<bits.Len(uint(n-1)))116 t.build(a, 1, 1, n)117 for ; q > 0; q-- {118 Fscan(in, &op, &l, &r)119 if op == 1 {120 Fscan(in, &x, &y)121 t.update(1, l, r, x, y)122 } else {123 ans := 0124 for i, c := range t.query(1, l, r) {125 ans += i * c126 }127 Fprintln(out, ans)128 }129 }130}131 132133