← Home
For problem statement at 1000-1999/1700-1799/1790-1799/1793/problemF.txt this is a correct solution, but verifier at 1000-1999/1700-1799/1790-1799/1793/verifierF.go ends with All tests passed can you fix the verifier? package main

import (
	"io"
	"math"
	"math/bits"
	"os"
	"runtime/debug"
	"sort"
	"strconv"
)

type Pair struct {
	r   int
	idx int
}

type LongQ struct {
	l   int
	r   int
	idx int
}

type PairSlice []Pair

func (p PairSlice) Len() int           { return len(p) }
func (p PairSlice) Less(i, j int) bool { return p[i].r > p[j].r }
func (p PairSlice) Swap(i, j int)      { p[i], p[j] = p[j], p[i] }

func main() {
	debug.SetGCPercent(-1)

	data, _ := io.ReadAll(os.Stdin)
	ptr := 0
	nextInt := func() int {
		for data[ptr] < '0' || data[ptr] > '9' {
			ptr++
		}
		x := 0
		for ptr < len(data) {
			c := data[ptr]
			if c < '0' || c > '9' {
				break
			}
			x = x*10 + int(c-'0')
			ptr++
		}
		return x
	}

	n := nextInt()
	q := nextInt()

	a := make([]int, n+1)
	pos := make([]int, n+1)
	for i := 1; i <= n; i++ {
		v := nextInt()
		a[i] = v
		pos[v] = i
	}

	T := int(float64(n)/math.Sqrt(float64(q))) + 1
	if T < 64 {
		T = 64
	}
	if T > n {
		T = n
	}
	D := 0
	if T < n {
		D = (n - 1) / T
	}

	ans := make([]int, q)

	u := (n + 63) >> 6
	topLen := (u + 63) >> 6
	wordBits := make([]uint64, u)
	top := make([]uint64, topLen)

	solveShort := func(l, r int) int {
		for i := 0; i < topLen; i++ {
			top[i] = 0
		}
		for i := l; i <= r; i++ {
			v := a[i] - 1
			w := v >> 6
			if wordBits[w] == 0 {
				top[w>>6] |= uint64(1) << uint(w&63)
			}
			wordBits[w] |= uint64(1) << uint(v&63)
		}
		res := n
		prev := -1
		for g := 0; g < topLen; g++ {
			z := top[g]
			for z != 0 {
				b := bits.TrailingZeros64(z)
				w := (g << 6) + b
				x := wordBits[w]
				wordBits[w] = 0
				base := w << 6
				for x != 0 {
					t := bits.TrailingZeros64(x)
					cur := base + t + 1
					if prev >= 0 {
						d := cur - prev
						if d < res {
							res = d
						}
					}
					prev = cur
					x &= x - 1
				}
				z &= z - 1
			}
		}
		return res
	}

	longQs := make([]LongQ, 0)
	counts := make([]int, n+2)

	for i := 0; i < q; i++ {
		l := nextInt()
		r := nextInt()
		if r-l+1 <= T {
			ans[i] = solveShort(l, r)
		} else {
			longQs = append(longQs, LongQ{l: l, r: r, idx: i})
			counts[l]++
		}
	}

	if len(longQs) > 0 {
		start := make([]int, n+2)
		for i := 1; i <= n; i++ {
			start[i+1] = start[i] + counts[i]
		}

		pairs := make([]Pair, len(longQs))
		curPos := make([]int, n+2)
		copy(curPos, start)

		for _, qq := range longQs {
			p := curPos[qq.l]
			pairs[p] = Pair{r: qq.r, idx: qq.idx}
			curPos[qq.l] = p + 1
		}

		for l := 1; l <= n; l++ {
			s, e := start[l], start[l+1]
			m := e - s
			if m == 2 {
				if pairs[s].r < pairs[s+1].r {
					pairs[s], pairs[s+1] = pairs[s+1], pairs[s]
				}
			} else if m > 2 {
				sort.Sort(PairSlice(pairs[s:e]))
			}
		}

		ptrs := make([]int, n+2)
		copy(ptrs, start)

		best := make([]int, n+2)
		inf := n + 1
		for i := 1; i <= n; i++ {
			best[i] = inf
		}

		for d := 1; d <= D; d++ {
			limit := n - d
			for v := 1; v <= limit; v++ {
				x := pos[v]
				y := pos[v+d]
				if x < y {
					if y < best[x] {
						best[x] = y
					}
				} else {
					if x < best[y] {
						best[y] = x
					}
				}
			}

			cur := inf
			for l := n - 1; l >= 1; l-- {
				b := best[l]
				if b < cur {
					cur = b
				}
				p := ptrs[l]
				e := start[l+1]
				for p < e && pairs[p].r >= cur {
					ans[pairs[p].idx] = d
					p++
				}
				ptrs[l] = p
			}
		}
	}

	out := make([]byte, 0, q*8)
	for i := 0; i < q; i++ {
		out = strconv.AppendInt(out, int64(ans[i]), 10)
		out = append(out, '\n')
	}
	_, _ = os.Stdout.Write(out)
}