Use this to learn the idea, then write your own version.
1package main2 3import (4 "bufio"5 . "fmt"6 "io"7 "sort"8)9 1011type seg57 []struct{ l, r, max, from, todoMax, todoFrom int }12 13func (t seg57) build(o, l, r int) {14 t[o].l, t[o].r = l, r15 if l == r {16 return17 }18 m := (l + r) >> 119 t.build(o<<1, l, m)20 t.build(o<<1|1, m+1, r)21}22 23func (t seg57) do(o, v, i int) {24 to := &t[o]25 if v > to.todoMax {26 to.todoMax, to.todoFrom = v, i27 }28 if v > to.max {29 to.max, to.from = v, i30 }31}32 33func (t seg57) spread(o int) {34 if v := t[o].todoMax; v != 0 {35 t.do(o<<1, v, t[o].todoFrom)36 t.do(o<<1|1, v, t[o].todoFrom)37 t[o].todoMax = 038 }39}40 41func (t seg57) update(o, l, r, v, i int) {42 if l <= t[o].l && t[o].r <= r {43 t.do(o, v, i)44 return45 }46 t.spread(o)47 m := (t[o].l + t[o].r) >> 148 if l <= m {49 t.update(o<<1, l, r, v, i)50 }51 if m < r {52 t.update(o<<1|1, l, r, v, i)53 }54 lo, ro := t[o<<1], t[o<<1|1]55 t[o].max, t[o].from = max57(lo.max, lo.from, ro.max, ro.from)56}57 58func (t seg57) query(o, l, r int) (int, int) {59 if l <= t[o].l && t[o].r <= r {60 return t[o].max, t[o].from61 }62 t.spread(o)63 m := (t[o].l + t[o].r) >> 164 if r <= m {65 return t.query(o<<1, l, r)66 }67 if m < l {68 return t.query(o<<1|1, l, r)69 }70 a, af := t.query(o<<1, l, r)71 b, bf := t.query(o<<1|1, l, r)72 return max57(a, af, b, bf)73}74 75func CF1557D(_r io.Reader, _w io.Writer) {76 in := bufio.NewReader(_r)77 out := bufio.NewWriter(_w)78 defer out.Flush()79 type pair struct{ l, r int }80 81 var n, m, row, l, r int82 Fscan(in, &n, &m)83 rs := make([][]pair, n+1)84 x := make([]int, 0, m*2)85 for ; m > 0; m-- {86 Fscan(in, &row, &l, &r)87 rs[row] = append(rs[row], pair{l, r})88 x = append(x, l, r)89 }90 sort.Ints(x)91 kth, k := map[int]int{}, 192 for i, v := range x {93 if i == 0 || v != x[i-1] {94 kth[v] = k95 k++96 }97 }98 99 t := make(seg57, k*4)100 t.build(1, 1, k)101 fs := make([]int, n+1)102 for i, rs := range rs {103 if rs == nil {104 continue105 }106 mx, from := 0, 0107 for _, p := range rs {108 v, f := t.query(1, kth[p.l], kth[p.r])109 if v > mx {110 mx, from = v, f111 }112 }113 fs[i] = from114 mx++115 for _, p := range rs {116 t.update(1, kth[p.l], kth[p.r], mx, i)117 }118 }119 Fprintln(out, n-t[1].max)120 save := make([]bool, n+1)121 for i := t[1].from; i > 0; i = fs[i] {122 save[i] = true123 }124 for i := 1; i <= n; i++ {125 if !save[i] {126 Fprint(out, i, " ")127 }128 }129}130 131func max57(a, af, b, bf int) (int, int) {132 if a > b {133 return a, af134 }135 return b, bf136}137 138139