Use this to learn the idea, then write your own version.
1package main2 3import (4 "bufio"5 . "fmt"6 "io"7)8 910type seg39 []struct {11 l, r, todo, max, min int12 sum int6413}14 15func (t seg39) maintain(o int) {16 l, r := t[o<<1], t[o<<1|1]17 t[o].max = l.max18 t[o].min = r.min19 t[o].sum = l.sum + r.sum20}21 22func (t seg39) build(a []int, o, l, r int) {23 t[o].l, t[o].r = l, r24 if l == r {25 t[o].max = a[l-1]26 t[o].min = a[l-1]27 t[o].sum = int64(a[l-1])28 return29 }30 m := (l + r) >> 131 t.build(a, o<<1, l, m)32 t.build(a, o<<1|1, m+1, r)33 t.maintain(o)34}35 36func (t seg39) do(O, v int) {37 o := &t[O]38 o.todo = v39 o.max = v40 o.min = v41 o.sum = int64(o.r-o.l+1) * int64(v)42}43 44func (t seg39) spread(o int) {45 if v := t[o].todo; v > 0 {46 t.do(o<<1, v)47 t.do(o<<1|1, v)48 t[o].todo = 049 }50}51 52func (t seg39) update(o, r, v int) {53 if v <= t[o].min {54 return55 }56 if t[o].r <= r && v >= t[o].max {57 t.do(o, v)58 return59 }60 t.spread(o)61 t.update(o<<1, r, v)62 if (t[o].l+t[o].r)>>1 < r {63 t.update(o<<1|1, r, v)64 }65 t.maintain(o)66}67 68func (t seg39) query(o, l int, v *int64) int {69 if *v < int64(t[o].min) {70 return 071 }72 if l <= t[o].l && *v >= t[o].sum {73 *v -= t[o].sum74 return t[o].r - t[o].l + 175 }76 t.spread(o)77 m := (t[o].l + t[o].r) >> 178 if m < l {79 return t.query(o<<1|1, l, v)80 }81 vl := t.query(o<<1, l, v)82 vr := t.query(o<<1|1, l, v)83 return vl + vr84}85 86func CF1439C(_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, tp, p, v int92 Fscan(in, &n, &q)93 a := make([]int, n)94 for i := range a {95 Fscan(in, &a[i])96 }97 t := make(seg39, 4*n)98 t.build(a, 1, 1, n)99 for ; q > 0; q-- {100 if Fscan(in, &tp, &p, &v); tp == 1 {101 t.update(1, p, v)102 } else {103 v := int64(v)104 Fprintln(out, t.query(1, p, &v))105 }106 }107}108 109110