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 seg74 []struct{ l, r, mx, p int }12 13func (seg74) maxPos(a, pa, b, pb int) (int, int) {14 if a > b {15 return a, pa16 }17 return b, pb18}19 20func (t seg74) build(o, l, r int) {21 t[o].l, t[o].r = l, r22 if l == r {23 return24 }25 m := (l + r) >> 126 t.build(o<<1, l, m)27 t.build(o<<1|1, m+1, r)28}29 30func (t seg74) update(o, i, v, p int) {31 if t[o].l == t[o].r {32 t[o].mx, t[o].p = v, p33 return34 }35 if i <= (t[o].l+t[o].r)>>1 {36 t.update(o<<1, i, v, p)37 } else {38 t.update(o<<1|1, i, v, p)39 }40 lo, ro := t[o<<1], t[o<<1|1]41 t[o].mx, t[o].p = t.maxPos(lo.mx, lo.p, ro.mx, ro.p)42}43 44func (t seg74) query(o, l, r int) (int, int) {45 if l <= t[o].l && t[o].r <= r {46 return t[o].mx, t[o].p47 }48 m := (t[o].l + t[o].r) >> 149 if r <= m {50 return t.query(o<<1, l, r)51 }52 if m < l {53 return t.query(o<<1|1, l, r)54 }55 mxl, pl := t.query(o<<1, l, r)56 mxr, pr := t.query(o<<1|1, l, r)57 return t.maxPos(mxl, pl, mxr, pr)58}59 60func CF474E(_r io.Reader, _w io.Writer) {61 in := bufio.NewReader(_r)62 out := bufio.NewWriter(_w)63 defer out.Flush()64 65 var n, mxL, end int66 var d int6467 Fscan(in, &n, &d)68 a := make([]int64, n)69 for i := range a {70 Fscan(in, &a[i])71 }72 73 b := append([]int64(nil), a...)74 sort.Slice(b, func(i, j int) bool { return b[i] < b[j] })75 k := 176 kth := map[int64]int{b[0]: k}77 for i := 1; i < n; i++ {78 if b[i] != b[i-1] {79 k++80 kth[b[i]] = k81 }82 }83 84 t := make(seg74, 4*k)85 t.build(1, 1, k)86 fa := make([]int, n)87 for i := range fa {88 fa[i] = -189 }90 for i, v := range a {91 cur := 092 if j := sort.Search(n, func(i int) bool { return b[i] > v-d }); j > 0 {93 if mx, pre := t.query(1, 1, kth[b[j-1]]); mx > cur {94 cur = mx95 fa[i] = pre96 }97 }98 if j := sort.Search(n, func(i int) bool { return b[i] >= v+d }); j < n {99 if mx, pre := t.query(1, kth[b[j]], k); mx > cur {100 cur = mx101 fa[i] = pre102 }103 }104 cur++105 if cur > mxL {106 mxL, end = cur, i107 }108 t.update(1, kth[v], cur, i)109 }110 ans := []int{}111 for x := end; x >= 0; x = fa[x] {112 ans = append(ans, x)113 }114 Fprintln(out, len(ans))115 for i := len(ans) - 1; i >= 0; i-- {116 Fprint(out, ans[i]+1, " ")117 }118}119 120121