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>.
/* package codechef; // don't place package name! */

import java.util.*;
import java.lang.*;
import java.io.*;

/* Name of the class has to be "Main" only if the class is public. */
public class Codechef
{
	public static void main (String[] args) throws java.lang.Exception
	{
		// your code goes here
		MyScanner sc = new MyScanner();
		int n = sc.nextInt();
        
		out = new PrintWriter(new BufferedOutputStream(System.out));
		TreeSet<Integer> set = new TreeSet<Integer>();
		Map<Integer, Integer> map = new HashMap<Integer, Integer>();
		set.add(0);
        for (int i = 0; i < n; ++i){
            String s = sc.next();
            int k = sc.nextInt();
            if (s.equals("+")){
                if (!map.containsKey(k)){
                    map.put(k, 1);
                    set.add(k);
                }else{
                    map.put(k, map.get(k) + 1);
                }
            }else if (s.equals("-")){
                if (map.get(k) == 1){
                    set.remove(k);
                    map.remove(k);
                }else{
                    map.put(k, map.get(k) - 1);
                }
            }else{
                int res = Find(set, map, k);
                out.println(res);
            }
        }
		out.close();
	}
	
	private static int Find(TreeSet<Integer> set, Map<Integer, Integer> map, int k){
	   // System.out.println(k + " " + set.size());
	    int[] arr = new int[32];
	    for (int i = 0; i < 32; ++i){
	        if ((k & (1 << i)) != 0){
	            arr[i] = 1;
	        }
	    }
	    int cur = 0;
	    int res = 0;
	    for (int i = 30; i >= 0; --i){
            if (arr[i] == 0){
                cur |= (1 << i);
                if (set.ceiling(cur) != null){
                    int z = set.ceiling(cur);
                    if ((cur >> i) != (z >>i)){
                        cur ^= (1 << i);
                    }
                }else{
                    cur ^= (1 << i);
                }
            }else{
                if (set.ceiling(cur) != null){
                    int z = set.ceiling(cur);
                    if ((cur >> i) != (z >>i)){
                        cur |= (1 << i);
                    }
                }else{
                    cur |= (1 << i);
                }
            }
            // System.out.println("find: " + cur);

	    }
	   //System.out.println("result: " + cur + " xor: " + k ^ cur);
	    return k ^ cur;
	}
	
	    //-----------PrintWriter for faster output---------------------------------
   public static PrintWriter out;
      
   //-----------MyScanner class for faster input----------
   public 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;
      }

   }
}
