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 info6 struct{ ans, tot, pre, suf int }12 13type seg6 []struct {14 l, r int15 info616}17 18func (t seg6) mergeInfo(a, b info6) info6 {19 return info6{20 max(a.ans, b.ans, a.suf+b.pre),21 a.tot + b.tot,22 max(a.pre, a.tot+b.pre),23 max(b.suf, b.tot+a.suf),24 }25}26 27func (t seg6) build(o, l, r int) {28 t[o].l, t[o].r = l, r29 if l == r {30 return31 }32 m := (l + r) >> 133 t.build(o<<1, l, m)34 t.build(o<<1|1, m+1, r)35}36 37func (t seg6) update(o, i, v int) {38 if t[o].l == t[o].r {39 v += t[o].info6.tot40 t[o].info6 = info6{v, v, v, v}41 return42 }43 if i <= (t[o].l+t[o].r)>>1 {44 t.update(o<<1, i, v)45 } else {46 t.update(o<<1|1, i, v)47 }48 t[o].info6 = t.mergeInfo(t[o<<1].info6, t[o<<1|1].info6)49}50 51func (t seg6) query(o, l, r int) (d info6) {52 if l <= t[o].l && t[o].r <= r {53 return t[o].info654 }55 m := (t[o].l + t[o].r) >> 156 if r <= m {57 return t.query(o<<1, l, r)58 }59 if m < l {60 return t.query(o<<1|1, l, r)61 }62 return t.mergeInfo(t.query(o<<1, l, r), t.query(o<<1|1, l, r))63}64 65func cf1906F(in io.Reader, _w io.Writer) {66 out := bufio.NewWriter(_w)67 defer out.Flush()68 var n, m, q, l, r, v int69 Fscan(in, &n, &m)70 type pair struct{ i, v int }71 ops := make([][]pair, n+2)72 for i := 1; i <= m; i++ {73 Fscan(in, &l, &r, &v)74 ops[l] = append(ops[l], pair{i, v})75 ops[r+1] = append(ops[r+1], pair{i, -v})76 }77 78 Fscan(in, &q)79 type query struct{ l, r, qi int }80 qs := make([][]query, n+1)81 for i := range q {82 Fscan(in, &v, &l, &r)83 qs[v] = append(qs[v], query{l, r, i})84 }85 86 ans := make([]int, q)87 t := make(seg6, 2<<bits.Len(uint(m)))88 t.build(1, 1, m)89 for i, qs := range qs {90 for _, p := range ops[i] {91 t.update(1, p.i, p.v)92 }93 for _, q := range qs {94 ans[q.qi] = t.query(1, q.l, q.r).ans95 }96 }97 for _, v := range ans {98 Fprintln(out, v)99 }100}101 102103