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")
}
}
}