← Home
For problem statement at 0-999/900-999/970-979/979/problemD.txt this is a correct solution, but verifier at 0-999/900-999/970-979/979/verifierD.go ends with All tests passed can you fix the verifier? package main

import (
	"bufio"
	"io"
	"os"
	"strconv"
)

func main() {
	buf, _ := io.ReadAll(os.Stdin)
	var pos int
	nextInt := func() int32 {
		for pos < len(buf) && buf[pos] <= ' ' {
			pos++
		}
		if pos >= len(buf) {
			return 0
		}
		var res int32 = 0
		for pos < len(buf) && buf[pos] > ' ' {
			res = res*10 + int32(buf[pos]-'0')
			pos++
		}
		return res
	}

	q := nextInt()

	capacity := 15000000
	ch0 := make([]int32, 1, capacity)
	ch1 := make([]int32, 1, capacity)
	minVal := make([]int32, 1, capacity)
	minVal[0] = 1e9

	newNode := func() int32 {
		idx := int32(len(ch0))
		ch0 = append(ch0, 0)
		ch1 = append(ch1, 0)
		minVal = append(minVal, 1e9)
		return idx
	}

	var root [100005]int32
	var has [100005]bool

	insert := func(k, u int32) {
		if root[k] == 0 {
			root[k] = newNode()
		}
		curr := root[k]
		if u < minVal[curr] {
			minVal[curr] = u
		}
		for bit := 16; bit >= 0; bit-- {
			b := (u >> bit) & 1
			if b == 0 {
				if ch0[curr] == 0 {
					ch0[curr] = newNode()
				}
				curr = ch0[curr]
			} else {
				if ch1[curr] == 0 {
					ch1[curr] = newNode()
				}
				curr = ch1[curr]
			}
			if u < minVal[curr] {
				minVal[curr] = u
			}
		}
	}

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

	for i := int32(0); i < q; i++ {
		t := nextInt()
		if t == 1 {
			u := nextInt()
			if !has[u] {
				has[u] = true
				for j := int32(1); j*j <= u; j++ {
					if u%j == 0 {
						insert(j, u)
						if j*j != u {
							insert(u/j, u)
						}
					}
				}
			}
		} else {
			x := nextInt()
			k := nextInt()
			s := nextInt()

			if x%k != 0 {
				out.WriteString("-1\n")
				continue
			}
			if root[k] == 0 || minVal[root[k]] > s-x {
				out.WriteString("-1\n")
				continue
			}
			curr := root[k]
			var v int32 = 0
			for bit := 16; bit >= 0; bit-- {
				b := (x >> bit) & 1
				best := 1 - b
				var next int32
				if best == 0 {
					next = ch0[curr]
				} else {
					next = ch1[curr]
				}

				if next != 0 && minVal[next] <= s-x {
					curr = next
					if best == 1 {
						v |= (1 << bit)
					}
				} else {
					if best == 0 {
						curr = ch1[curr]
						v |= (1 << bit)
					} else {
						curr = ch0[curr]
					}
				}
			}
			out.WriteString(strconv.Itoa(int(v)) + "\n")
		}
	}
}