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.*;
import java.util.*;
public class B {
	public static void main(String[] args)throws Throwable {
		MyScanner sc=new MyScanner();
		PrintWriter pw=new PrintWriter(System.out);
		
		int n=sc.nextInt();
		Trie t=new Trie();
		int in=0;
		while(n-->0){
			char c=sc.next().charAt(0);
			int x=sc.nextInt();
			String s=Integer.toBinaryString(x);
			while(s.length()<32)
				s="0"+s;
			if(c=='+'){
				in++;
				t.insert(s.toCharArray(), 0);
			}
			else
				if(c=='-'){
					in--;
					t.remove(s.toCharArray(), 0);
				}
				else{
					if(in>0){
						int y=Integer.parseInt(t.search(s.toCharArray(), 0), 2);
						pw.println(Math.max(x, x^y));			
					}else
						pw.println(x);
				}
		}
		
		pw.flush();
		pw.close();
	}
	
	static class Trie {
		Trie [] child;
		int cnt;
		
		Trie(){
			child=new Trie[2];
		}
		
		void insert(char [] s , int idx){
			cnt++;
			if(idx<s.length){
				int c=s[idx]-'0';
				if(child[c]==null)
					child[c]=new Trie();
				child[c].insert(s, idx+1);
			}
		}
		
		void remove(char [] s , int idx){
			cnt--;
			if(idx<s.length){
				int c=s[idx]-'0';
				child[c].remove(s, idx+1);
			}
		}
		
		String search(char [] s,int idx){
			if(idx==s.length)
				return "";
			int c=1-(s[idx]-'0');
			if(child[c]==null || child[c].cnt==0)
				c=1-c;
			return ""+c+child[c].search(s, idx+1);
		}
	}
	
	static class MyScanner {
		BufferedReader br;
		StringTokenizer st;
		public MyScanner() {br = new BufferedReader(new InputStreamReader(System.in));}
		String next() {while (st == null || !st.hasMoreElements()) {
			try {st = new StringTokenizer(br.readLine());}
			catch (IOException e) {e.printStackTrace();}}
		return st.nextToken();}
		int nextInt() {return Integer.parseInt(next());}
		long nextLong() {return Long.parseLong(next());}
		double nextDouble() {return Double.parseDouble(next());}
		String nextLine(){String str = "";
		try {str = br.readLine();}
		catch (IOException e) {e.printStackTrace();}
		return str;}
	}
}
