Use this to learn the idea, then write your own version.
1package main2 3import (4 "bufio"5 . "fmt"6 "io"7 "math/bits"8 . "slices"9 "sort"10)11 1213type data95 struct{ c, s, res int }14type seg95 []struct {15 l, r int16 d data9517}18 19func (t seg95) merge(l, r data95) data95 {20 return data95{l.c + r.c, l.s + r.s, l.res + r.res + r.s*l.c - l.s*r.c}21}22 23func (t seg95) build(o, l, r int) {24 t[o].l, t[o].r = l, r25 if l == r {26 return27 }28 m := (l + r) >> 129 t.build(o<<1, l, m)30 t.build(o<<1|1, m+1, r)31}32 33func (t seg95) update(o, i, c, v int) {34 cur := &t[o]35 if cur.l == cur.r {36 cur.d.c += c37 cur.d.s += v38 return39 }40 m := (cur.l + cur.r) >> 141 if i <= m {42 t.update(o<<1, i, c, v)43 } else {44 t.update(o<<1|1, i, c, v)45 }46 cur.d = t.merge(t[o<<1].d, t[o<<1|1].d)47}48 49func (t seg95) query(o, l, r int) data95 {50 if l <= t[o].l && t[o].r <= r {51 return t[o].d52 }53 m := (t[o].l + t[o].r) >> 154 if r <= m {55 return t.query(o<<1, l, r)56 }57 if m < l {58 return t.query(o<<1|1, l, r)59 }60 return t.merge(t.query(o<<1, l, r), t.query(o<<1|1, l, r))61}62 63func cf295E(in io.Reader, _w io.Writer) {64 out := bufio.NewWriter(_w)65 defer out.Flush()66 var n, k int67 Fscan(in, &n)68 a := make([]int, n)69 for i := range a {70 Fscan(in, &a[i])71 }72 b := Clone(a)73 xs := Clone(a)74 Fscan(in, &k)75 qs := make([]struct{ op, l, r int }, k)76 for i := range qs {77 Fscan(in, &qs[i].op, &qs[i].l, &qs[i].r)78 if qs[i].op == 1 {79 qs[i].l--80 j := qs[i].l81 b[j] += qs[i].r82 xs = append(xs, b[j])83 }84 }85 Sort(xs)86 xs = Compact(xs)87 m := len(xs)88 89 t := make(seg95, 2<<bits.Len(uint(m-1)))90 t.build(1, 0, m-1)91 lb := sort.SearchInts92 for _, v := range a {93 t.update(1, lb(xs, v), 1, v)94 }95 for _, q := range qs {96 if q.op == 1 {97 i := q.l98 t.update(1, lb(xs, a[i]), -1, -a[i])99 a[i] += q.r100 t.update(1, lb(xs, a[i]), 1, a[i])101 } else {102 l, r := lb(xs, q.l), lb(xs, q.r+1)-1103 if l > r {104 Fprintln(out, 0)105 } else {106 Fprintln(out, t.query(1, l, r).res)107 }108 }109 }110}111 112113