← Home
package main

import (
	"bufio"
	"fmt"
	"os"
)

var next0 []int32
var next1 []int32
var cnt []int32

func newNode() int32 {
	next0 = append(next0, -1)
	next1 = append(next1, -1)
	cnt = append(cnt, 0)
	return int32(len(cnt) - 1)
}

func insert(x int, delta int32) {
	v := int32(0)
	cnt[0] += delta
	for b := 30; b >= 0; b-- {
		bit := (x >> b) & 1
		vi := int(v)
		if bit == 0 {
			if next0[vi] == -1 {
				child := newNode()
				next0[vi] = child
			}
			v = next0[vi]
		} else {
			if next1[vi] == -1 {
				child := newNode()
				next1[vi] = child
			}
			v = next1[vi]
		}
		cnt[int(v)] += delta
	}
}

func query(x int) int {
	v := int32(0)
	res := 0
	for b := 30; b >= 0; b-- {
		bit := (x >> b) & 1
		vi := int(v)
		if bit == 0 {
			p := next1[vi]
			if p != -1 && cnt[int(p)] > 0 {
				v = p
				res |= 1 << b
			} else {
				o := next0[vi]
				if o != -1 && cnt[int(o)] > 0 {
					v = o
				} else if p != -1 {
					v = p
					res |= 1 << b
				} else {
					v = o
				}
			}
		} else {
			p := next0[vi]
			if p != -1 && cnt[int(p)] > 0 {
				v = p
				res |= 1 << b
			} else {
				o := next1[vi]
				if o != -1 && cnt[int(o)] > 0 {
					v = o
				} else if p != -1 {
					v = p
					res |= 1 << b
				} else {
					v = o
				}
			}
		}
	}
	return res
}

func main() {
	in := bufio.NewReaderSize(os.Stdin, 1<<20)
	out := bufio.NewWriterSize(os.Stdout, 1<<20)
	defer out.Flush()

	var q int
	fmt.Fscan(in, &q)

	capNodes := (q + 5) * 32
	next0 = make([]int32, 1, capNodes)
	next1 = make([]int32, 1, capNodes)
	cnt = make([]int32, 1, capNodes)
	next0[0] = -1
	next1[0] = -1

	insert(0, 1)

	for i := 0; i < q; i++ {
		var op string
		var x int
		fmt.Fscan(in, &op, &x)
		switch op[0] {
		case '+':
			insert(x, 1)
		case '-':
			insert(x, -1)
		case '?':
			ans := query(x)
			fmt.Fprintln(out, ans)
		}
	}
}