Author has gone out of the stories about Vasiliy, so here is just a formal task description.

You are given q queries and a multiset A, initially containing only integer 0. There are three types of queries:

  1. "+ x" — add integer x to multiset A.
  2. "- x" — erase one occurrence of integer x from multiset A. It's guaranteed that at least one x is present in the multiset A before this query.
  3. "? x" — you are given integer x and need to compute the value <image>, i.e. the maximum value of bitwise exclusive OR (also know as XOR) of integer x and some integer y from the multiset A.



Multiset is a set, where equal elements are allowed.

Input

The first line of the input contains a single integer q (1 ≤ q ≤ 200 000) — the number of queries Vasiliy has to perform.

Each of the following q lines of the input contains one of three characters '+', '-' or '?' and an integer xi (1 ≤ xi ≤ 109). It's guaranteed that there is at least one query of the third type.

Note, that the integer 0 will always be present in the set A.

Output

For each query of the type '?' print one integer — the maximum value of bitwise exclusive OR (XOR) of integer xi and some integer from the multiset A.

Example

Input

10
+ 8
+ 9
+ 11
+ 6
+ 1
? 3
- 8
? 3
? 8
? 11


Output

11
10
14
13

Note

After first five operations multiset A contains integers 0, 8, 9, 11, 6 and 1.

The answer for the sixth query is integer <image> — maximum among integers <image>, <image>, <image>, <image> and <image>.

import java.util.*;
import java.io.*;

public class CF_A {
	static BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
	static StringTokenizer st;
	static void newST() throws IOException {st = new StringTokenizer(in.readLine());}
	static int stInt() {return Integer.parseInt(st.nextToken());}
	static long stLong() {return Long.parseLong(st.nextToken());}
	static String stStr() {return st.nextToken();}
	static int[] getInts(int n) throws IOException {newST(); int[] arr = new int[n]; for (int i = 0; i < n; i++) arr[i] = stInt(); return arr;}
	static int readInt() throws IOException {return Integer.parseInt(in.readLine());}
	static long readLong() throws IOException {return Long.parseLong(in.readLine());}
	static void println(Object o) {System.out.println(o);}
	static void println() {System.out.println();}
	static void print(Object o) {System.out.print(o);}
	
	public static void main(String[] args) throws Exception {
		int qs = readInt();
		Node tree = new Node(31, 0);
		tree.add(0);
		for (int q = 0; q < qs; q++) {
			newST();
			char c = st.nextToken().charAt(0);
			int n = stInt();
			if (c == '+') tree.add(n);
			else if (c == '-') tree.del(n);
			else {
				Node node = tree;
				while (node.bit > 0) node = node.best(n);
				System.out.println(n^node.val);
			}
		}
	}
}

class Node {
	static final int[] TWO = new int[] {1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384, 32768, 65536, 131072, 262144, 524288, 1048576, 2097152, 4194304, 8388608, 16777216, 33554432, 67108864, 134217728, 268435456, 536870912, 1073741824};
	int num = 0;
	int val = 0; 
	Node[] ch = new Node[2];
	int bit;
	public Node(int b, int v) {
		bit = b;
		val = v;
	}
	public void add(int n) {
		num++;
		if (bit == 0) return;
		int nb = nbit(n);
		if (ch[nb] == null) ch[nb] = new Node(bit-1, val*2+nb);
		ch[nb].add(n);
	}
	public void del(int n) {
		num--;
		if (bit == 0) return;
		int nb = nbit(n);
		ch[nb].del(n);
		if (ch[nb].num == 0) ch[nb] = null;
	}
	public Node best(int n) {
		if (bit == 0) return null;
		int bb = nbit(n)^1;
		if (ch[bb] != null) return ch[bb];
		return ch[bb^1];
	}
	public int nbit(int n) {
		return (n&TWO[bit-1])/TWO[bit-1];
	}
}