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 1011type seg98 []struct {12 l, r int13 val [60]uint3214}15 16func (seg98) merge(a, b [60]uint32) (c [60]uint32) {17 for i, t := range a {18 c[i] = t + b[(uint32(i)+t)%60]19 }20 return21}22 23func (seg98) set(v int) (c [60]uint32) {24 for i := range c {25 if i%v == 0 {26 c[i] = 227 } else {28 c[i] = 129 }30 }31 return c32}33 34func (t seg98) maintain(o int) {35 t[o].val = t.merge(t[o<<1].val, t[o<<1|1].val)36}37 38func (t seg98) build(a []int, o, l, r int) {39 t[o].l, t[o].r = l, r40 if l == r {41 t[o].val = t.set(a[l])42 return43 }44 m := (l + r) >> 145 t.build(a, o<<1, l, m)46 t.build(a, o<<1|1, m+1, r)47 t.maintain(o)48}49 50func (t seg98) update(o, i, val int) {51 if t[o].l == t[o].r {52 t[o].val = t.set(val)53 return54 }55 m := (t[o].l + t[o].r) >> 156 if i <= m {57 t.update(o<<1, i, val)58 } else {59 t.update(o<<1|1, i, val)60 }61 t.maintain(o)62}63 64func (t seg98) query(o, l, r int) [60]uint32 {65 if l <= t[o].l && t[o].r <= r {66 return t[o].val67 }68 m := (t[o].l + t[o].r) >> 169 if r <= m {70 return t.query(o<<1, l, r)71 }72 if m < l {73 return t.query(o<<1|1, l, r)74 }75 return t.merge(t.query(o<<1, l, r), t.query(o<<1|1, l, r))76}77 78func cf498D(in io.Reader, _w io.Writer) {79 out := bufio.NewWriter(_w)80 defer out.Flush()81 var n, q, l, r int82 var op string83 Fscan(in, &n)84 a := make([]int, n)85 for i := range a {86 Fscan(in, &a[i])87 }88 t := make(seg98, 2<<bits.Len(uint(n-1)))89 t.build(a, 1, 0, n-1)90 91 Fscan(in, &q)92 for range q {93 Fscan(in, &op, &l, &r)94 if op == "A" {95 Fprintln(out, t.query(1, l-1, r-2)[0])96 } else {97 t.update(1, l-1, r)98 }99 }100}101 102103