← Home
For problem statement at 2000-2999/2000-2099/2090-2099/2093/problemG.txt this is a correct solution, but verifier at 2000-2999/2000-2099/2090-2099/2093/verifierG.go ends with test 4: expected 2, got -1
exit status 1 can you fix the verifier? ```go
package main

import (
	"bufio"
	"fmt"
	"io"
	"math/bits"
	"os"
	"sort"
)

type SegTree struct {
	size int
	data []int
}

func NewSegTree(n int) *SegTree {
	size := 1
	for size < n {
		size <<= 1
	}
	data := make([]int, 2*size)
	return &SegTree{size: size, data: data}
}

func (st *SegTree) Update(idx int, val int) {
	p := idx + st.size
	if st.data[p] == val {
		return
	}
	st.data[p] = val
	for p >>= 1; p >= 1; p >>= 1 {
		lc, rc := p<<1, (p<<1)|1
		if st.data[lc] >= st.data[rc] {
			st.data[p] = st.data[lc]
		} else {
			st.data[p] = st.data[rc]
		}
	}
}

func (st *SegTree) Query(l, r int) int {
	if l > r {
		return 0
	}
	l += st.size
	r += st.size
	res := 0
	for l <= r {
		if (l & 1) == 1 {
			if st.data[l] > res {
				res = st.data[l]
			}
			l++
		}
		if (r & 1) == 0 {
			if st.data[r] > res {
				res = st.data[r]
			}
			r--
		}
		l >>= 1
		r >>= 1
	}
	return res
}

func lowerBound(a []int, x int) int {
	return sort.Search(len(a), func(i int) bool { return a[i] >= x })
}
func upperBound(a []int, x int) int {
	return sort.Search(len(a), func(i int) bool { return a[i] > x })
}

type Pair struct {
	l int
	r int
}

func decomposeRange(l, r int) []Pair {
	var res []Pair
	cur := l
	for cur <= r {
		size1 := int(uint(cur) & -uint(cur))
		if size1 == 0 {
			size1 = 1 << 30
		}
		remain := r - cur + 1
		size2 := 1 << (bits.Len(uint(remain)) - 1)
		size := size1
		if size2 < size {
			size = size2
		}
		res = append(res, Pair{cur, cur + size - 1})
		cur += size
	}
	return res
}

func main() {
	data, _ := io.ReadAll(os.Stdin)
	pos := 0
	nextInt := func() int {
		n := len(data)
		for pos < n && (data[pos] < '0' || data[pos] > '9') && data[pos] != '-' {
			pos++
		}
		sign := 1
		if pos < n && data[pos] == '-' {
			sign = -1
			pos++
		}
		val := 0
		for pos < n && data[pos] >= '0' && data[pos] <= '9' {
			val = val*10 + int(data[pos]-'0')
			pos++
		}
		return val * sign
	}

	out := bufio.NewWriter(os.Stdout)
	defer out.Flush()

	t := nextInt()
	for ; t > 0; t-- {
		n := nextInt()
		k := nextInt()
		a := make([]int, n)
		for i := 0; i < n; i++ {
			a[i] = nextInt()
		}
		if k == 0 {
			fmt.Fprintln(out, 1)
			continue
		}
		h := bits.Len(uint(k)) - 1
		M := 1 << h
		rem := k - M

		diffAdj := false
		for i := 1; i < n; i++ {
			if (a[i]>>(h+1)) != (a[i-1]>>(h+1)) {
				diffAdj = true
				break
			}
		}
		if diffAdj {
			fmt.Fprintln(out, 2)
			continue
		}

		// All P are equal across array
		// Prepare groups by bit h and low values
		vals := [2][]int{}
		bitsH := make([]int, n)
		lows := make([]int, n)
		for i := 0; i < n; i++ {
			b := (a[i] >> h) & 1
			bitsH[i] = b
			low := a[i] & (M - 1)
			lows[i] = low
			vals[b] = append(vals[b], low)
		}
		for g := 0; g < 2; g++ {
			if len(vals[g]) > 0 {
				sort.Ints(vals[g])
				// unique
				j := 1
				for i := 1; i < len(vals[g]); i++ {
					if vals[g][i] != vals[g][i-1] {
						vals[g][j] = vals[g][i]
						j++
					}
				}
				vals[g] = vals[g][:j]
			}
		}

		// If one group empty, no pair possible
		if len(vals[0]) == 0 || len(vals[1]) == 0 {
			fmt.Fprintln(out, -1)
			continue
		}

		st := [2]*SegTree{NewSegTree(len(vals[0])), NewSegTree(len(vals[1]))}

		ans := n + 1
		blocks := decomposeRange(rem, M-1)

		for j := 0; j < n; j++ {
			y := lows[j]
			b := bitsH[j]
			opp := 1 - b
			best := 0
			for _, bl := range blocks {
				lz := bl.l ^ y
				rz := bl.r ^ y
				// These are dyadic intervals; we must ensure lz <= rz (always true as size preserves and XOR maps to aligned block)
				li := lowerBound(vals[opp], lz)
				ri := upperBound(vals[opp], rz) - 1
				if li <= ri {
					v := st[opp].Query(li, ri)
					if v > best {
						best = v
					}
				}
			}
			if best > 0 {
				// indices are 1-based for length calculation: store positions as 1-based
				L := j + 1 - best + 1
				if L < ans {
					ans = L
				}
			}
			// update current group's segment tree with this position (store 1-based index)
			idx := lowerBound(vals[b], y)
			st[b].Update(idx, j+1)
		}

		if ans == n+1 {
			fmt.Fprintln(out, -1)
		} else {
			fmt.Fprintln(out, ans)
		}
	}
}
```