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 Solution
{
    public static void main(String ag[])
    {
        Scanner sc=new Scanner(System.in);
        int i,j,k;
        int T=sc.nextInt();
        Trie trie=new Trie();
        trie.insert(0);//this line is very matherchod coz of this previous submission went wrong.
        while(T-->0)
        {
            String str=sc.next();
            int value=sc.nextInt();
            if(str.equals("+"))
            {
                trie.insert(value);
            }
            else if(str.equals("-"))
            {
                trie.delete(value);
            }
            else 
            {
                System.out.println(trie.query(value));
            }
        }
    }
}
class Trie 
{
    Node root;
    Trie()
    {
        root=new Node();
    }
    public void insert(int value)
    {
        Node curr=root;
        for(int i=31;i>=0;i--)
        {
            Node parent=curr;
            int X=((1<<i)&value);
            if(X>0)
            {
                if(curr.right==null)
                curr.right=new Node();
                curr=curr.right;
            }
            else 
            {
                if(curr.left==null)
                curr.left=new Node();
                curr=curr.left;
            }
            curr.parent=parent;
        }
        curr.freq++;
    }
    public void delete(int value)
    {
        Node curr=root;
        for(int i=31;i>=0;i--)
        {
            int X=(1<<i)&value;
            if(X>0)
            curr=curr.right;
            else 
            curr=curr.left;
        }
        curr.freq--;
        //System.out.println(curr.freq+" "+value);
        if(curr.freq==0)
        {
            if(curr.left==null&&curr.right==null)
            {
                while(curr.left==null&&curr.right==null&&curr.parent!=null&&curr.freq==0)
                {
                    Node parent=curr.parent;
                    if(parent.left==curr)
                    parent.left=null;
                    else parent.right=null;
                    curr=parent;
                }
            }
        }
    }
    public int query(int value)
    {
        int ans=0;
        Node curr=root;
        
        for(int i=31;i>=0;i--)
        {
            int X=(1<<i)&value;
            if(X>0)
            {
                if(curr.left!=null)
                {
                    ans|=(1<<i);
                    curr=curr.left;
                }
                else
                curr=curr.right;
            }
            else 
            {
                if(curr.right!=null)
                {
                    ans|=(1<<i);
                    curr=curr.right;
                }
                else 
                curr=curr.left;
            }
        }
        return ans;
    }
}
class Node
{
    Node left,right,parent;
    int freq;
    Node()
    {
    }
}