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 data39 struct{ lv, rv, preD, preID, sufI, sufID, mx int }12type seg39 []struct {13 l, r int14 d data3915 todo int16}17 18func (t seg39) apply(o, f int) {19 cur := &t[o]20 cur.d.lv += f21 cur.d.rv += f22 cur.todo += f23}24 25func (t seg39) maintain(o int) {26 lo, ro := &t[o<<1], &t[o<<1|1]27 lsz := lo.r - lo.l + 128 rsz := ro.r - ro.l + 129 l, r := lo.d, ro.d30 inc := l.rv < r.lv31 dec := l.rv > r.lv32 ne := l.rv != r.lv33 34 preD := l.preD35 if dec && preD == lsz {36 preD += r.preD37 }38 sufI := r.sufI39 if inc && sufI == rsz {40 sufI += l.sufI41 }42 43 preID := l.preID44 if dec && preID == lsz {45 preID += r.preD46 }47 if l.sufI == lsz {48 if ne {49 preID = max(preID, lsz+r.preD)50 }51 if inc {52 preID = max(preID, lsz+r.preID)53 }54 }55 56 sufID := r.sufID57 if inc && sufID == rsz {58 sufID += l.sufI59 }60 if r.preD == rsz {61 if ne {62 sufID = max(sufID, l.sufI+rsz)63 }64 if dec {65 sufID = max(sufID, l.sufID+rsz)66 }67 }68 69 mx := max(l.mx, r.mx)70 if ne {71 mx = max(mx, l.sufI+r.preD)72 }73 if dec {74 mx = max(mx, l.sufID+r.preD)75 }76 if inc {77 mx = max(mx, l.sufI+r.preID)78 }79 80 t[o].d = data39{l.lv, r.rv, preD, preID, sufI, sufID, mx}81}82 83func (t seg39) spread(o int) {84 f := t[o].todo85 if f == 0 {86 return87 }88 t.apply(o<<1, f)89 t.apply(o<<1|1, f)90 t[o].todo = 091}92 93func (t seg39) build(in io.Reader, o, l, r int) {94 t[o].l, t[o].r = l, r95 if l == r {96 var v int97 Fscan(in, &v)98 t[o].d = data39{v, v, 1, 1, 1, 1, 1}99 return100 }101 m := (l + r) >> 1102 t.build(in, o<<1, l, m)103 t.build(in, o<<1|1, m+1, r)104 t.maintain(o)105}106 107func (t seg39) update(o, l, r, f int) {108 if l <= t[o].l && t[o].r <= r {109 t.apply(o, f)110 return111 }112 t.spread(o)113 m := (t[o].l + t[o].r) >> 1114 if l <= m {115 t.update(o<<1, l, r, f)116 }117 if m < r {118 t.update(o<<1|1, l, r, f)119 }120 t.maintain(o)121}122 123func cf739C(in io.Reader, _w io.Writer) {124 out := bufio.NewWriter(_w)125 defer out.Flush()126 var n, m, l, r, v int127 Fscan(in, &n)128 t := make(seg39, 2<<bits.Len(uint(n-1)))129 t.build(in, 1, 1, n)130 Fscan(in, &m)131 for range m {132 Fscan(in, &l, &r, &v)133 t.update(1, l, r, v)134 Fprintln(out, t[1].d.mx)135 }136}137 138139