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 seg65 []struct {12 l, r int13 minDiff int14 a []int15}16 17func (t seg65) build(a []int, o, l, r int) {18 t[o].l, t[o].r, t[o].minDiff = l, r, 2e919 t[o].a = append([]int(nil), a[l-1:r]...)20 sort.Ints(t[o].a)21 if l == r {22 return23 }24 m := (l + r) >> 125 t.build(a, o<<1, l, m)26 t.build(a, o<<1|1, m+1, r)27}28 29var curMin int30 31func (t seg65) update(o, i, v int) {32 if t[o].l == t[o].r {33 t[o].minDiff = min(t[o].minDiff, abs65(v-t[o].a[0]))34 curMin = min(curMin, t[o].minDiff)35 return36 }37 if i >= t[o].r {38 39 a := t[o].a40 p := sort.SearchInts(a, v)41 if (p == 0 || v-a[p-1] >= curMin) && (p == len(a) || a[p]-v >= curMin) {42 curMin = min(curMin, t[o].minDiff)43 return 44 }45 }46 m := (t[o].l + t[o].r) >> 147 if i > m {48 t.update(o<<1|1, i, v) 49 }50 t.update(o<<1, i, v)51 t[o].minDiff = min(t[o<<1].minDiff, t[o<<1|1].minDiff)52}53 54func (t seg65) query(o, l int) int {55 if l <= t[o].l {56 return t[o].minDiff57 }58 if (t[o].l+t[o].r)>>1 < l {59 return t.query(o<<1|1, l)60 }61 return min(t.query(o<<1, l), t[o<<1|1].minDiff)62}63 64func CF765F(_r io.Reader, _w io.Writer) {65 in := bufio.NewReader(_r)66 out := bufio.NewWriter(_w)67 defer out.Flush()68 69 var n, q int70 Fscan(in, &n)71 a := make([]int, n)72 for i := range a {73 Fscan(in, &a[i])74 }75 Fscan(in, &q)76 qs := make([]struct{ l, r, i int }, q)77 for i := range qs {78 Fscan(in, &qs[i].l, &qs[i].r)79 qs[i].i = i80 }81 sort.Slice(qs, func(i, j int) bool { return qs[i].r < qs[j].r })82 83 ans := make([]int, q)84 t := make(seg65, 4*n)85 t.build(a, 1, 1, n)86 for r, qi := 2, 0; r <= n; r++ {87 curMin = 2e988 t.update(1, r-1, a[r-1])89 for ; qi < q && qs[qi].r == r; qi++ {90 ans[qs[qi].i] = t.query(1, qs[qi].l)91 }92 }93 for _, v := range ans {94 Fprintln(out, v)95 }96}97 98func abs65(x int) int {99 if x < 0 {100 return -x101 }102 return x103}104 105106