Use this to learn the idea, then write your own version.
1package main2 3import (4 . "fmt"5 "io"6 "math/bits"7)8 910type seg15 []struct{ l, r, mx, todo int }11 12func (t seg15) apply(o, f int) {13 t[o].mx += f14 t[o].todo += f15}16 17func (t seg15) maintain(o int) {18 t[o].mx = max(t[o<<1].mx, t[o<<1|1].mx)19}20 21func (t seg15) spread(o int) {22 f := t[o].todo23 if f == 0 {24 return25 }26 t.apply(o<<1, f)27 t.apply(o<<1|1, f)28 t[o].todo = 029}30 31func (t seg15) build(o, l, r int) {32 t[o].l, t[o].r = l, r33 t[o].mx = -1e1834 if l == r {35 return36 }37 m := (l + r) >> 138 t.build(o<<1, l, m)39 t.build(o<<1|1, m+1, r)40}41 42func (t seg15) set(o, i, v int) {43 if t[o].l == t[o].r {44 t[o].mx = v45 return46 }47 t.spread(o)48 m := (t[o].l + t[o].r) >> 149 if i <= m {50 t.set(o<<1, i, v)51 } else {52 t.set(o<<1|1, i, v)53 }54 t.maintain(o)55}56 57func (t seg15) update(o, l, r, f int) {58 if l <= t[o].l && t[o].r <= r {59 t.apply(o, f)60 return61 }62 t.spread(o)63 m := (t[o].l + t[o].r) >> 164 if l <= m {65 t.update(o<<1, l, r, f)66 }67 if m < r {68 t.update(o<<1|1, l, r, f)69 }70 t.maintain(o)71}72 73func (t seg15) query(o, l, r int) int {74 if l <= t[o].l && t[o].r <= r {75 return t[o].mx76 }77 t.spread(o)78 m := (t[o].l + t[o].r) >> 179 if r <= m {80 return t.query(o<<1, l, r)81 }82 if l > m {83 return t.query(o<<1|1, l, r)84 }85 return max(t.query(o<<1, l, r), t.query(o<<1|1, l, r))86}87 88func cf115E(in io.Reader, out io.Writer) {89 var n, m, l, r, p, f int90 Fscan(in, &n, &m)91 s := make([]int, n+1)92 for i := 1; i <= n; i++ {93 Fscan(in, &s[i])94 s[i] += s[i-1]95 }96 type pair struct{ l, p int }97 g := make([][]pair, n+1)98 for range m {99 Fscan(in, &l, &r, &p)100 g[r] = append(g[r], pair{l, p})101 }102 103 t := make(seg15, 2<<bits.Len(uint(n-1)))104 t.build(1, 1, n)105 for i := 1; i <= n; i++ {106 t.set(1, i, f+s[i-1])107 for _, p := range g[i] {108 t.update(1, 1, p.l, p.p)109 }110 f = max(f, t.query(1, 1, i)-s[i])111 }112 Fprint(out, f)113}114 115116