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 seg14 []struct{ l, r, gcd int }12 13func (t seg14) maintain(o int) {14 t[o].gcd = gcd14(t[o<<1].gcd, t[o<<1|1].gcd)15}16 17func (t seg14) build(in io.Reader, o, l, r int) {18 t[o].l, t[o].r = l, r19 if l == r {20 Fscan(in, &t[o].gcd)21 return22 }23 m := (l + r) >> 124 t.build(in, o<<1, l, m)25 t.build(in, o<<1|1, m+1, r)26 t.maintain(o)27}28 29func (t seg14) update(o, i, v int) {30 cur := &t[o]31 if cur.l == cur.r {32 cur.gcd = v33 return34 }35 m := (cur.l + cur.r) >> 136 if i <= m {37 t.update(o<<1, i, v)38 } else {39 t.update(o<<1|1, i, v)40 }41 t.maintain(o)42}43 44func (t seg14) query(o, l, r, v int) int {45 if t[o].gcd%v == 0 {46 return 047 }48 if t[o].l == t[o].r {49 return 150 }51 m := (t[o].l + t[o].r) >> 152 cnt := 053 if l <= m {54 cnt += t.query(o<<1, l, r, v)55 }56 if cnt < 2 && r > m {57 cnt += t.query(o<<1|1, l, r, v)58 }59 return cnt60}61 62func cf914D(in io.Reader, _w io.Writer) {63 out := bufio.NewWriter(_w)64 defer out.Flush()65 var n, q, op, l, r, v int66 Fscan(in, &n)67 t := make(seg14, 2<<bits.Len(uint(n-1)))68 t.build(in, 1, 1, n)69 70 Fscan(in, &q)71 for range q {72 Fscan(in, &op, &l, &r)73 if op == 2 {74 t.update(1, l, r)75 continue76 }77 Fscan(in, &v)78 if t.query(1, l, r, v) < 2 {79 Fprintln(out, "YES")80 } else {81 Fprintln(out, "NO")82 }83 }84}85 8687func gcd14(a, b int) int { for a != 0 { a, b = b%a, a }; return b }88