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 GFG {
    static TrieNode root = new TrieNode();
    
    static class TrieNode {
        TrieNode[] children = new TrieNode[2];
        int[] bits = new int[2];
        
        TrieNode(){
            bits[0] = bits[1] = 0;
            children[0] = null;
            children[1] = null;
        }
    }
    
    static void update(String word , int val){
        TrieNode tn = root;
        for(int i=0; i<32; i++){
            int bit = Integer.parseInt(word.charAt(i)+"");
            tn.bits[bit] += val;
            if( tn.children[bit] == null)  tn.children[bit] = new TrieNode();
            tn =  tn.children[bit];
        }
    }
    
    static String getMax(String word){
        String res = "";
        TrieNode tn = root;
        for(int i=0; i<32; i++){
            int bit = Integer.parseInt(word.charAt(i)+"");
            if(tn.bits[1-bit]>0){
                res+="1";
                bit = 1-bit;
            }
            else res+="0";
            tn = tn.children[bit];
        }
        
        return res ;
    }


    static String getWord32bits(int x){
        String bin = Integer.toBinaryString(x);
        while(bin.length()<32){
            bin = "0"+bin;
        }
        return bin;
    }
    
	public static void main (String[] args) throws Exception{
	    Scanner  in = new Scanner(System.in);
	    OutputStream out = new BufferedOutputStream(System.out);
	    TrieNode tn = root;
	    for(int i=0; i<32; i++){
	        tn.bits[0]++;
	        tn.children[0] = new TrieNode();
	        tn = tn.children[0];
	    }
	    int q = in.nextInt();
	    for(int j=0; j<q; j++){
	        char type = in.next().charAt(0);
	        String bin = getWord32bits(in.nextInt());
	        if(type=='+')
	            update(bin , +1);
	        else if(type=='-')
	            update(bin , -1);
	        else
	            out.write((Integer.parseInt(getMax(bin) , 2)+"\n").getBytes());
	    } 
	    out.flush();
	}
}