Use this to learn the idea, then write your own version.
1package main2 3import (4 "bufio"5 . "fmt"6 "io"7 "math/bits"8 "slices"9 "sort"10)11 1213type pair5 struct{ b, i int }14var g5 [][]pair515 16type seg5 []struct{ l, r, min int }17 18func (t seg5) maintain(o int) {19 t[o].min = min(t[o<<1].min, t[o<<1|1].min)20}21 22func (t seg5) build(o, l, r int) {23 t[o].l, t[o].r = l, r24 if l == r {25 t[o].min = g5[l][0].b26 return27 }28 m := (l + r) >> 129 t.build(o<<1, l, m)30 t.build(o<<1|1, m+1, r)31 t.maintain(o)32}33 34func (t seg5) delete(o, qr, maxY int, f func(int)) {35 l := t[o].l36 if l >= qr || t[o].min > maxY {37 return38 }39 if l == t[o].r {40 f(l)41 t[o].min = g5[l][0].b42 return43 }44 t.delete(o<<1|1, qr, maxY, f)45 t.delete(o<<1, qr, maxY, f)46 t.maintain(o)47}48 49func cf605D(in io.Reader, _w io.Writer) {50 out := bufio.NewWriter(_w)51 defer out.Flush()52 var n int53 Fscan(in, &n)54 a := make([]struct{ a, b, c, d int }, n+1)55 xs := make([]int, n+1)56 for i := 1; i <= n; i++ {57 Fscan(in, &a[i].a, &a[i].b, &a[i].c, &a[i].d)58 xs[i] = a[i].a59 }60 slices.Sort(xs)61 xs = slices.Compact(xs)62 m := len(xs)63 64 g5 = make([][]pair5, m)65 for i := 1; i <= n; i++ {66 x := sort.SearchInts(xs, a[i].a)67 g5[x] = append(g5[x], pair5{a[i].b, i})68 }69 for i, ps := range g5 {70 slices.SortFunc(ps, func(a, b pair5) int { return a.b - b.b })71 g5[i] = append(ps, pair5{2e9, 0}) 72 }73 t := make(seg5, 2<<bits.Len(uint(m-1)))74 t.build(1, 0, m-1)75 76 q := []int{0}77 pre := make([]int, n+1)78 for len(q) > 0 {79 i := q[0]80 q = q[1:]81 if i == n {82 ans := []int{}83 for ; i > 0; i = pre[i] {84 ans = append(ans, i)85 }86 Fprintln(out, len(ans))87 for i := len(ans) - 1; i >= 0; i-- {88 Fprint(out, ans[i], " ")89 }90 Fprintln(out)91 return92 }93 94 maxY := a[i].d95 t.delete(1, sort.SearchInts(xs, a[i].c+1), maxY, func(l int) {96 ps := g5[l]97 for ps[0].b <= maxY {98 pre[ps[0].i] = i99 q = append(q, ps[0].i)100 ps = ps[1:]101 }102 g5[l] = ps103 })104 }105 Fprint(out, -1)106}107 108109