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.io.PrintWriter;
import java.util.*;

public class VasilysMultiset
{

	public static void main(String[] args)
	{
		Scanner scan = new Scanner(System.in);
		PrintWriter out = new PrintWriter(System.out);
		int n = scan.nextInt();
		Trie t = new Trie();
		String zero = "";
		while(zero.length() < 40) zero = "0"+zero;
		t.add(zero);
		for(int q = 1; q <= n; q++) {
			String type = scan.next();
			String s = Integer.toBinaryString(scan.nextInt());
			while(s.length() < 40) s = "0"+s;
			
			if(type.equals("+")) {
				t.add(s);
			}
			if(type.equals("-")) {
				t.remove(s);
			}
			if(type.equals("?")) {
				out.println(t.max(s));
			}
		}
		out.flush();
	}

	static class Trie {
		// adjust size of map for range of characters
		// along with index making
		Trie[] map;
		char letter;
		int end, numStrings;

		public Trie() { this('$', 0); } // root constructor
		public Trie(char ll, int ee) {
			letter = ll;
			end = ee;
			map = new Trie[2];
			for(int i = 0 ; i < 2 ; i++) map[i] = null;
		}
		public Trie add(String s) {
			Trie root = this;
			for(int i = 0 ; i < s.length() ; i++) {
				int index = s.charAt(i) - '0';
				if(root.map[index] == null)
					root.map[index] = new Trie(s.charAt(i), 0);
				root.numStrings++;
				root = root.map[index];
			}
			root.numStrings++;
			root.end++;
			return this;
		}
		public Trie remove(String s) {
			Trie root = this;
			for(int i = 0; i < s.length() ; i++) {
				int index = s.charAt(i) - '0';
				root.numStrings--;
				root = root.map[index];
			}
			root.numStrings--;
			root.end++;
			return this;
		}
		public long max(String s) {
			Trie root = this;
			long xor = 0;
			for(int i = 0; i < s.length(); i++) {
				long pow = (1L << (39-i));
				int index = s.charAt(i)-'0';
				if(root.map[index^1] == null) {
					root = root.map[index];
				}
				else {
					Trie next = root.map[index^1];
					if(next.numStrings == 0) {
						root = root.map[index];
					}
					else {
						root = root.map[index^1];
						xor ^= pow;
					}
				}
			}
			return xor;
		}
	}
}
