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 seg84 []struct{ l, r, mn int }12 13func (t seg84) maintain(o int) {14 t[o].mn = min(t[o<<1].mn, t[o<<1|1].mn)15}16 17func (t seg84) build(a []int, o, l, r int) {18 t[o].l, t[o].r = l, r19 if l == r {20 t[o].mn = a[l]21 return22 }23 m := (l + r) >> 124 t.build(a, o<<1, l, m)25 t.build(a, o<<1|1, m+1, r)26 t.maintain(o)27}28 29func (t seg84) update(o, i, v int) {30 cur := &t[o]31 if cur.l == cur.r {32 cur.mn = 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 44var gMin84 int45 46func (t seg84) query(o, ql, qr int) int {47 tl, tr := t[o].l, t[o].r48 if ql <= tl && tr <= qr {49 mn := min(gMin84, t[o].mn)50 if mn == tr-ql {51 return 152 }53 if mn > tr-ql {54 gMin84 = mn55 return -156 }57 if tl == tr {58 return 059 }60 res := t.query(o<<1, ql, qr)61 if res < 0 {62 res = t.query(o<<1|1, ql, qr)63 }64 return max(res, 0)65 }66 67 m := (tl + tr) >> 168 if qr <= m {69 return t.query(o<<1, ql, qr)70 }71 if m < ql {72 return t.query(o<<1|1, ql, qr)73 }74 75 res := t.query(o<<1, ql, qr)76 if res < 0 {77 res = t.query(o<<1|1, ql, qr)78 }79 return res80}81 82func cf2184G(in io.Reader, _w io.Writer) {83 out := bufio.NewWriter(_w)84 defer out.Flush()85 var T, n, q, op, l, r int86 for Fscan(in, &T); T > 0; T-- {87 Fscan(in, &n, &q)88 a := make([]int, n)89 for i := range a {90 Fscan(in, &a[i])91 }92 t := make(seg84, 2<<bits.Len(uint(n-1)))93 t.build(a, 1, 0, n-1)94 for range q {95 Fscan(in, &op, &l, &r)96 if op == 1 {97 t.update(1, l-1, r)98 } else {99 gMin84 = 1e9100 Fprintln(out, max(t.query(1, l-1, r-1), 0))101 }102 }103 }104}105 106107