Use this to learn the idea, then write your own version.
1package main2 3import (4 "bufio"5 . "fmt"6 "io"7 "math/bits"8 "sort"9)10 1112type seg93 []struct {13 l, r int14 minDiff int15 a []int16}17 18func (t seg93) build(a []int, o, l, r int) {19 t[o].l, t[o].r, t[o].minDiff = l, r, 2e920 t[o].a = append([]int(nil), a[l-1:r]...)21 sort.Ints(t[o].a)22 if l == r {23 return24 }25 m := (l + r) >> 126 t.build(a, o<<1, l, m)27 t.build(a, o<<1|1, m+1, r)28}29 30var curMin int31 32func (t seg93) update(o, i, v int) {33 if t[o].l == t[o].r {34 t[o].minDiff = min(t[o].minDiff, abs93(v-t[o].a[0]))35 curMin = min(curMin, t[o].minDiff)36 return37 }38 if i >= t[o].r {39 40 a := t[o].a41 p := sort.SearchInts(a, v)42 if (p == 0 || v-a[p-1] >= curMin) && (p == len(a) || a[p]-v >= curMin) {43 curMin = min(curMin, t[o].minDiff)44 return 45 }46 }47 m := (t[o].l + t[o].r) >> 148 if i > m {49 t.update(o<<1|1, i, v) 50 }51 t.update(o<<1, i, v)52 t[o].minDiff = min(t[o<<1].minDiff, t[o<<1|1].minDiff)53}54 55func (t seg93) query(o, l int) int {56 if l <= t[o].l {57 return t[o].minDiff58 }59 if (t[o].l+t[o].r)>>1 < l {60 return t.query(o<<1|1, l)61 }62 return min(t.query(o<<1, l), t[o<<1|1].minDiff)63}64 65func cf1793F(_r io.Reader, _w io.Writer) {66 in := bufio.NewReader(_r)67 out := bufio.NewWriter(_w)68 defer out.Flush()69 70 var n, q int71 Fscan(in, &n, &q)72 a := make([]int, n)73 for i := range a {74 Fscan(in, &a[i])75 }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(seg93, 2<<bits.Len(uint(n-1)))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 9899func abs93(x int) int { if x < 0 { return -x }; return x }100