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.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.util.StringTokenizer;

import javax.management.Query;


public class B{
	
	public static void main(String[] args) throws IOException {
		Scanner sc=new Scanner(System.in);
		PrintWriter wr=new PrintWriter(System.out);
		int n=sc.nextInt();
		Trie t=new Trie();
		t.insert(0);
		while(n-->0) {
			String x=sc.next();
			if(x.charAt(0)=='+')t.insert(sc.nextInt());
			else if(x.charAt(0)=='-')t.delete(sc.nextInt());
			else wr.println(t.query(sc.nextInt()));
		}
		
		wr.close();


	} 
	static class Trie{
		static class Node{
			int val;int vis=0;
			Node arr[]=new Node[2];
		}
		static class pair{
			Node n;
			int val;
			pair(Node arr2,int val){
				this.n=arr2;
				this.val=val;
			}
		}
		static final int  INT_SIZE=32;
		static Node root=new Node();
		void insert (int pre) {
			Node nxt=root;
			for(int i=INT_SIZE-1;i>=0;i--) {
				int val=(pre & (1<<i)) >=1?1:0;       
				if(nxt.arr[val] == null) {
					nxt.arr[val]=new Node();
				}
				nxt.arr[val].vis++;
				nxt=nxt.arr[val];

			}
			nxt.vis++;
			nxt.val=pre;
		}
		void delete(int pre) {
			Node nxt=root;
			for(int i=INT_SIZE-1;i>=0;i--) {
				int val=(pre & (1<<i)) >=1?1:0;       
				
				nxt.arr[val].vis--;
				nxt=nxt.arr[val];

			}
			nxt.vis--;
			
		}
		int query(int pre) {
			Node temp=root;
			int val=0;
			for(int i=INT_SIZE-1;i>=0;i--) {
				val=(pre & (1<<i))>=1?1:0;
				if(temp.arr[1-val]!=null && temp.arr[1-val].vis>=1 ) {
					temp =temp.arr[1-val];
					

				}else if(temp.arr[val]!=null && temp.arr[val].vis>=1) {
					temp=temp.arr[val];
				}
			}
			

			//System.out.println(pre+" "+temp.val);
			return pre^temp.val;
		}
	}



}

class Scanner 
{
	StringTokenizer st;
	BufferedReader br;

	public Scanner(InputStream s){	br = new BufferedReader(new InputStreamReader(s));}

	public String next() throws IOException 
	{
		while (st == null || !st.hasMoreTokens()) 
			st = new StringTokenizer(br.readLine());
		return st.nextToken();
	}

	public int nextInt() throws IOException {return Integer.parseInt(next());}

	public long nextLong() throws IOException {return Long.parseLong(next());}

	public String nextLine() throws IOException {return br.readLine();}

	public double nextDouble() throws IOException
	{
		String x = next();
		StringBuilder sb = new StringBuilder("0");
		double res = 0, f = 1;
		boolean dec = false, neg = false;
		int start = 0;
		if(x.charAt(0) == '-')
		{
			neg = true;
			start++;
		}
		for(int i = start; i < x.length(); i++)
			if(x.charAt(i) == '.')
			{
				res = Long.parseLong(sb.toString());
				sb = new StringBuilder("0");
				dec = true;
			}
			else
			{
				sb.append(x.charAt(i));
				if(dec)
					f *= 10;
			}
		res += Long.parseLong(sb.toString()) / f;
		return res * (neg?-1:1);
	}

	public boolean ready() throws IOException {return br.ready();}


}