Use this to learn the idea, then write your own version.
1package main2 3import (4 . "fmt"5 "io"6 "math/bits"7 "slices"8)9 1011type data80 struct{ min, minI int }12type seg80 []struct {13 l, r int14 data8015}16 17func (seg80) merge(a, b data80) data80 {18 if a.min < b.min {19 return a20 }21 return b22}23 24func (t seg80) build(v, o, l, r int) {25 t[o].l, t[o].r = l, r26 t[o].min, t[o].minI = v, l27 if l == r {28 return29 }30 m := (l + r) >> 131 t.build(v, o<<1, l, m)32 t.build(v, o<<1|1, m+1, r)33}34 35func (t seg80) update(o, i, v int) {36 cur := &t[o]37 if cur.l == cur.r {38 cur.min = v39 return40 }41 m := (cur.l + cur.r) >> 142 if i <= m {43 t.update(o<<1, i, v)44 } else {45 t.update(o<<1|1, i, v)46 }47 t[o].data80 = t.merge(t[o<<1].data80, t[o<<1|1].data80)48}49 50func (t seg80) query(o, l, r int) data80 {51 if l <= t[o].l && t[o].r <= r {52 return t[o].data8053 }54 m := (t[o].l + t[o].r) >> 155 if r <= m {56 return t.query(o<<1, l, r)57 }58 if m < l {59 return t.query(o<<1|1, l, r)60 }61 return t.merge(t.query(o<<1, l, r), t.query(o<<1|1, l, r))62}63 64func cf780G(in io.Reader, out io.Writer) {65 const mod = 1_000_000_00766 var h, w, n, ans int67 Fscan(in, &h, &w, &n)68 type tuple struct{ u, l, r, s int }69 a := make([]tuple, n)70 for i := range a {71 Fscan(in, &a[i].u, &a[i].l, &a[i].r, &a[i].s)72 }73 slices.SortFunc(a, func(a, b tuple) int { return b.u - a.u })74 75 segT := make(seg80, 2<<bits.Len(uint(w-1)))76 segT.build(h+1, 1, 1, w)77 type pair struct{ h, num int }78 stk := make([][]pair, w+1)79 for i := 1; i <= w; i++ {80 stk[i] = []pair{{h + 1, 1}}81 }82 83 for _, t := range a {84 cnt := 085 for {86 d := segT.query(1, t.l, t.r)87 if d.min > t.u+t.s {88 break89 }90 91 i := d.minI92 p := stk[i]93 cnt += p[len(p)-1].num94 p = p[:len(p)-1]95 stk[i] = p96 97 if len(p) > 0 {98 h = p[len(p)-1].h99 } else {100 h = 3e9101 }102 segT.update(1, i, h)103 }104 if cnt == 0 {105 continue106 }107 if t.l == 1 || t.r == w {108 cnt *= 2109 }110 if l := t.l - 1; l > 0 {111 stk[l] = append(stk[l], pair{t.u, cnt % mod})112 segT.update(1, l, t.u)113 }114 if r := t.r + 1; r <= w {115 stk[r] = append(stk[r], pair{t.u, cnt % mod})116 segT.update(1, r, t.u)117 }118 }119 for _, ps := range stk {120 for _, p := range ps {121 ans += p.num122 }123 }124 Fprint(out, ans%mod)125}126 127128