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 info77 struct{ v, i int }12 13type seg77 []struct {14 l, r int15 max info7716 todo int17}18 19func (seg77) merge(a, b info77) info77 {20 if a.v > b.v || a.v == b.v && a.i > b.i {21 return a22 }23 return b24}25 26func (t seg77) apply(o, f int) {27 t[o].max.v += f28 t[o].todo += f29}30 31func (t seg77) maintain(o int) {32 t[o].max = t.merge(t[o<<1].max, t[o<<1|1].max)33}34 35func (t seg77) spread(o int) {36 f := t[o].todo37 if f == 0 {38 return39 }40 t.apply(o<<1, f)41 t.apply(o<<1|1, f)42 t[o].todo = 043}44 45func (t seg77) build(o, l, r int) {46 t[o].l, t[o].r = l, r47 t[o].max.i = r48 if l == r {49 return50 }51 m := (l + r) >> 152 t.build(o<<1, l, m)53 t.build(o<<1|1, m+1, r)54}55 56func (t seg77) update(o, l, r, f int) {57 if l <= t[o].l && t[o].r <= r {58 t.apply(o, f)59 return60 }61 t.spread(o)62 m := (t[o].l + t[o].r) >> 163 if l <= m {64 t.update(o<<1, l, r, f)65 }66 if m < r {67 t.update(o<<1|1, l, r, f)68 }69 t.maintain(o)70}71 72func cf377D(in io.Reader, _w io.Writer) {73 out := bufio.NewWriter(_w)74 defer out.Flush()75 const mx = 3e576 var n, l, v, r, ans, ll, rr int77 Fscan(in, &n)78 type worker struct{ l, v, r int }79 a := make([]worker, n)80 type tuple struct{ v, r, delta int }81 g := [mx + 2][]tuple{}82 for i := range a {83 Fscan(in, &l, &v, &r)84 a[i] = worker{l, v, r}85 g[l] = append(g[l], tuple{v, r, 1})86 g[v+1] = append(g[v+1], tuple{v, r, -1})87 }88 89 t := make(seg77, 2<<bits.Len(mx))90 t.build(1, 1, mx)91 for i, g := range g {92 for _, p := range g {93 t.update(1, p.v, p.r, p.delta)94 }95 if t[1].max.v > ans {96 ans = t[1].max.v97 ll, rr = i, t[1].max.i98 }99 }100 101 Fprintln(out, ans)102 for i, w := range a {103 if w.l <= ll && ll <= w.v && w.v <= rr && rr <= w.r {104 Fprint(out, i+1, " ")105 }106 }107}108 109110