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.*;
import java.math.BigInteger;

public class Main
{
    static final long mod=1000000007;
    static node root;
    public static void main(String[] args) throws Exception
    {
    	FastReader in=new FastReader();
    	PrintWriter pw=new PrintWriter(System.out);
    	root=new node();
    	insert(0);
    	Map<Integer,Integer> freq=new HashMap<>();
    	freq.put(0,1);
    	int n=in.nextInt();
    	while(n-->0)
    	{
    		char s=in.next().charAt(0);
    		int a=in.nextInt();
    		if(s=='+')
    		{
    			freq.put(a,freq.getOrDefault(a,0)+1);
    			if(freq.get(a)==1)
    				insert(a);
    		}
    		else if(s=='-')
    		{
    			freq.put(a,freq.get(a)-1);
    			if(freq.get(a)==0)
    				remove(a);
    		}
    		else
    		{
    			int ans=query(a);
    			pw.println(ans^a);
    		}
    	}
    	pw.flush();
    }

    static void insert(int a)
    {
    	node n=root;
    	for(int i=30;i>=0;i--)
    	{
    		int bit=(a>>i)&1;
    		if(n.child[bit]==null)
    			n.child[bit]=new node();
    		n.noc[bit]++;
    		n=n.child[bit];
    	}
    	n.e=true;
    }

    static void remove(int a)
    {
    	node n=root,r;
    	for(int i=30;i>=0;i--)
    	{
    		r=n;
    		int bit=(a>>i)&1;
    		n.noc[bit]--;
    		n=n.child[bit];
    		if(r.noc[bit]==0)
    		{
    			r.child[bit]=null;
    			r.noc[bit]=0;
    		}
    	}
    }

    static int query(int a)
    {
    	node n=root;
    	int b=0;
    	for(int i=30;i>=0;i--)
    	{
    		int bit=(a>>i)&1;
    		if(n.noc[1-bit]!=0)
    		{
    			b|=(1-bit)<<i;
    			n=n.child[1-bit];
    		}
    		else
    		{
    			b|=bit<<i;
    			n=n.child[bit];
    		}
    	}

    	return b;
    }

}

class node
{
	node[] child=new node[2];
	int[] noc=new int[2];
	boolean e=false;
}

class FastReader
{
    BufferedReader br;
    StringTokenizer st;
 
    public FastReader()
    {
        br=new BufferedReader(new InputStreamReader(System.in));
    }
 
    public String next() throws IOException
    {
        if(st==null || !st.hasMoreElements())
        {
            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());
    }
}