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.*;
         
      
      
      public class Solution{
   
       
       public static void main (String[] args) throws java.lang.Exception
{
        	    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        	    PrintWriter out = new PrintWriter(System.out);
        	     int n = Integer.parseInt(br.readLine());
        	    Trie t = new Trie();
        	    t.insert(0);
        	     for(int i=0; i<n; i++){
        	    StringTokenizer st = new StringTokenizer(br.readLine());
        	       String c = st.nextToken();
        	       int val = Integer.parseInt(st.nextToken());
        	       if(c.equals("+"))  t.insert(val);
        	       else if(c.equals("-")) t.delete(val);
        	       else
        	       out.println(t.search(val));
        	    }

        	   out.close();
        }
   }
class Node{
         int count;
         LinkedList<Node> ch = new LinkedList();
          Node(){
        	  ch.add(null);
        	  ch.add(null);
          }
      }
      
      class Trie{
          Node root;
          Trie(){
              root = new Node();
          }
          
          public void insert(int val){
              Node cur = root;
              
              for(int i=31; i>=0; i--){
                  int key = (val & (1<<i)) >=1 ?1:0;
                  if(cur.ch.get(key) == null) cur.ch.set(key, new Node());

                   cur =cur.ch.get(key);
                   cur.count++;
              }
          }
          
           public void delete(int val){
              Node cur = root;
              
              for(int i=31; i>=0; i--){
                  int key = (val & (1<<i)) >=1 ?1:0;
                   cur = cur.ch.get(key);
                   cur.count--;
              }
          }
          
             public int search(int val){
              Node cur = root;
              int ans = 0;
              for(int i=31; i>=0; i--){
                  int key = (val & (1<<i)) >=1 ?1:0;
                   if( cur.ch.get(1-key) != null && cur.ch.get(1-key).count > 0){
                    ans|=(1<<i);
                    cur = cur.ch.get(1-key);
                   }
                   else cur = cur.ch.get(key);
              }
              return ans;
          }
      }