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 seg52 []struct {12 l, r int13 min, todo int14}15 16func (t seg52) maintain(o int) {17 t[o].min = min(t[o<<1].min, t[o<<1|1].min)18}19 20func (t seg52) build(a []int, o, l, r int) {21 t[o].l, t[o].r = l, r22 if l == r {23 t[o].min = a[l-1]24 return25 }26 m := (l + r) >> 127 t.build(a, o<<1, l, m)28 t.build(a, o<<1|1, m+1, r)29 t.maintain(o)30}31 32func (t seg52) spread(o int) {33 if v := t[o].todo; v != 0 {34 lo, ro := &t[o<<1], &t[o<<1|1]35 lo.min += v36 lo.todo += v37 ro.min += v38 ro.todo += v39 t[o].todo = 040 }41}42 43func (t seg52) update(o, l, r, v int) {44 ol, or := t[o].l, t[o].r45 if l <= ol && or <= r {46 t[o].min += v47 t[o].todo += v48 return49 }50 t.spread(o)51 m := (ol + or) >> 152 if l <= m {53 t.update(o<<1, l, r, v)54 }55 if m < r {56 t.update(o<<1|1, l, r, v)57 }58 t.maintain(o)59}60 61func (t seg52) query(o, l, r int) int {62 if l <= t[o].l && t[o].r <= r {63 return t[o].min64 }65 t.spread(o)66 m := (t[o].l + t[o].r) >> 167 if r <= m {68 return t.query(o<<1, l, r)69 }70 if l > m {71 return t.query(o<<1|1, l, r)72 }73 return min(t.query(o<<1, l, r), t.query(o<<1|1, l, r))74}75 76func CF52C(_r io.Reader, _w io.Writer) {77 in := bufio.NewReader(_r)78 out := bufio.NewWriter(_w)79 defer out.Flush()80 81 var n, q, l, r, v int82 Fscan(in, &n)83 a := make([]int, n)84 for i := range a {85 Fscan(in, &a[i])86 }87 t := make(seg52, 2<<bits.Len(uint(n-1)))88 t.build(a, 1, 1, n)89 for Fscanf(in, "\n%d\n", &q); q > 0; q-- {90 m, _ := Fscanln(in, &l, &r, &v)91 l++92 r++93 if m == 3 {94 if l > r {95 t.update(1, l, n, v)96 t.update(1, 1, r, v)97 } else {98 t.update(1, l, r, v)99 }100 } else {101 if l > r {102 Fprintln(out, min(t.query(1, l, n), t.query(1, 1, r)))103 } else {104 Fprintln(out, t.query(1, l, r))105 }106 }107 }108}109 110111