Use this to learn the idea, then write your own version.
1package main2 3import (4 "bufio"5 . "fmt"6 "io"7)8 910type seg22 []struct{ l, r, val int }11 12func (t seg22) build(o, l, r int) {13 t[o].l, t[o].r, t[o].val = l, r, 1e914 if l == r {15 return16 }17 m := (l + r) >> 118 t.build(o<<1, l, m)19 t.build(o<<1|1, m+1, r)20}21 22func (t seg22) update(o, i, val int) {23 if t[o].l == t[o].r {24 t[o].val = val25 return26 }27 m := (t[o].l + t[o].r) >> 128 if i <= m {29 t.update(o<<1, i, val)30 } else {31 t.update(o<<1|1, i, val)32 }33 t[o].val = min22(t[o<<1].val, t[o<<1|1].val)34}35 36func (t seg22) query(o, l, r int) int {37 if l <= t[o].l && t[o].r <= r {38 return t[o].val39 }40 m := (t[o].l + t[o].r) >> 141 if r <= m {42 return t.query(o<<1, l, r)43 }44 if m < l {45 return t.query(o<<1|1, l, r)46 }47 return min22(t.query(o<<1, l, r), t.query(o<<1|1, l, r))48}49 50func CF522D(_r io.Reader, _w io.Writer) {51 in := bufio.NewReader(_r)52 out := bufio.NewWriter(_w)53 defer out.Flush()54 55 var n, m, l, r int56 Fscan(in, &n, &m)57 a := make([]int, n+1)58 for i := 1; i <= n; i++ {59 Fscan(in, &a[i])60 }61 type pair struct{ l, i int }62 q := make([][]pair, n+1)63 for i := 0; i < m; i++ {64 Fscan(in, &l, &r)65 q[r] = append(q[r], pair{l, i})66 }67 68 ans := make([]int, m)69 t := make(seg22, n*4)70 t.build(1, 1, n)71 last := map[int]int{}72 for i := 1; i <= n; i++ {73 if p := last[a[i]]; p > 0 {74 t.update(1, p, i-p)75 }76 for _, p := range q[i] {77 res := t.query(1, p.l, i)78 if res == 1e9 {79 res = -180 }81 ans[p.i] = res82 }83 last[a[i]] = i84 }85 for _, v := range ans {86 Fprintln(out, v)87 }88}89 9091 92func min22(a, b int) int {93 if a > b {94 return b95 }96 return a97}98