Use this to learn the idea, then write your own version.
1package main2 3import (4 "bufio"5 . "fmt"6 "io"7)8 910type seg38 []struct {11 l, r int12 max int13 sum int6414}15 16func (t seg38) set(o, v int) {17 t[o].max = v18 t[o].sum = int64(v)19}20 21func (t seg38) maintain(o int) {22 lo, ro := t[o<<1], t[o<<1|1]23 t[o].max = max38(lo.max, ro.max)24 t[o].sum = lo.sum + ro.sum25}26 27func (t seg38) build(a []int, o, l, r int) {28 t[o].l, t[o].r = l, r29 if l == r {30 t.set(o, a[l-1])31 return32 }33 m := (l + r) >> 134 t.build(a, o<<1, l, m)35 t.build(a, o<<1|1, m+1, r)36 t.maintain(o)37}38 39func (t seg38) mod(o, l, r, mod int) {40 if t[o].max < mod {41 return42 }43 if t[o].l == t[o].r {44 t[o].max %= mod45 t[o].sum = int64(t[o].max)46 return47 }48 m := (t[o].l + t[o].r) >> 149 if l <= m {50 t.mod(o<<1, l, r, mod)51 }52 if r > m {53 t.mod(o<<1|1, l, r, mod)54 }55 t.maintain(o)56}57 58func (t seg38) update(o, i, v int) {59 if t[o].l == t[o].r {60 t.set(o, v)61 return62 }63 m := (t[o].l + t[o].r) >> 164 if i <= m {65 t.update(o<<1, i, v)66 } else {67 t.update(o<<1|1, i, v)68 }69 t.maintain(o)70}71 72func (t seg38) query(o, l, r int) (res int64) {73 if l <= t[o].l && t[o].r <= r {74 return t[o].sum75 }76 m := (t[o].l + t[o].r) >> 177 if r <= m {78 return t.query(o<<1, l, r)79 }80 if m < l {81 return t.query(o<<1|1, l, r)82 }83 return t.query(o<<1, l, r) + t.query(o<<1|1, l, r)84}85 86func CF438D(_r io.Reader, _w io.Writer) {87 in := bufio.NewReader(_r)88 out := bufio.NewWriter(_w)89 defer out.Flush()90 91 var n, q, op, l, r, mod int92 Fscan(in, &n, &q)93 a := make([]int, n)94 for i := range a {95 Fscan(in, &a[i])96 }97 t := make(seg38, n*4)98 t.build(a, 1, 1, n)99 for ; q > 0; q-- {100 if Fscan(in, &op, &l, &r); op == 1 {101 Fprintln(out, t.query(1, l, r))102 } else if op == 2 {103 Fscan(in, &mod)104 t.mod(1, l, r, mod)105 } else {106 t.update(1, l, r)107 }108 }109}110 111func max38(a, b int) int {112 if a > b {113 return a114 }115 return b116}117 118119