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 seg42 []struct{ l, r, max, todo int }12 13func (t seg42) do(o, v int) {14 t[o].max += v15 t[o].todo += v16}17 18func (t seg42) spread(o int) {19 if v := t[o].todo; v != 0 {20 t.do(o<<1, v)21 t.do(o<<1|1, v)22 t[o].todo = 023 }24}25 26func (t seg42) build(o, l, r int) {27 t[o].l, t[o].r = l, r28 if l == r {29 return30 }31 m := (l + r) >> 132 t.build(o<<1, l, m)33 t.build(o<<1|1, m+1, r)34}35 36func (t seg42) update(o, l, r int, v int) {37 if l <= t[o].l && t[o].r <= r {38 t.do(o, v)39 return40 }41 t.spread(o)42 m := (t[o].l + t[o].r) >> 143 if l <= m {44 t.update(o<<1, l, r, v)45 }46 if m < r {47 t.update(o<<1|1, l, r, v)48 }49 t[o].max = max(t[o<<1].max, t[o<<1|1].max)50}51 52func (t seg42) query(o, l, r int) int {53 if l <= t[o].l && t[o].r <= r {54 return t[o].max55 }56 t.spread(o)57 m := (t[o].l + t[o].r) >> 158 if r <= m {59 return t.query(o<<1, l, r)60 }61 if l > m {62 return t.query(o<<1|1, l, r)63 }64 return max(t.query(o<<1, l, r), t.query(o<<1|1, l, r))65}66 67func cf1842E(_r io.Reader, out io.Writer) {68 in := bufio.NewReader(_r)69 var n, k, A, sc, f int70 Fscan(in, &n, &k, &A)71 type pair struct{ x, c int }72 ps := make([][]pair, k+1)73 for i := 0; i < n; i++ {74 var x, y, c int75 Fscan(in, &x, &y, &c)76 sc += c77 ps[k-y] = append(ps[k-y], pair{x, c})78 }79 80 t := make(seg42, 2<<bits.Len(uint(k)))81 t.build(1, 0, k)82 for i := 1; i <= k; i++ {83 t.update(1, 0, i-1, -A)84 for _, p := range ps[i] {85 t.update(1, 0, p.x, p.c)86 }87 f = max(f, t[1].max)88 t.update(1, i, i, f)89 }90 Fprint(out, sc-f)91}92 9394