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.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.util.Arrays;
import java.util.StringTokenizer;

/**
 * @author Don Li
 */
public class VasiliyMultiset {
    
    static final int MAXN = (int) (3e6 + 5);
    
    int id = 1;
    int[][] nxt = new int[MAXN][2];
    int[] cnt = new int[MAXN];
    
    void solve() {
        int q = in.nextInt();
        
        for (int i = 0; i < MAXN; i++) Arrays.fill(nxt[i], -1);
        
        add(0);
        while (q-- > 0) {
            char sign = in.nextToken().charAt(0);
            int x = in.nextInt();
            if (sign == '+') {
                add(x);
            } else if (sign == '-') {
                remove(x);
            } else {
                out.println(search(x));
            }
        }
    }
    
    void add(int x) {
        int v = 0;
        cnt[v]++;
        for (int i = 30; i >= 0; i--) {
            if ((x & (1 << i)) == 0) {
                if (nxt[v][0] == -1) v = nxt[v][0] = id++;
                else v = nxt[v][0];
            } else {
                if (nxt[v][1] == -1) v = nxt[v][1] = id++;
                else v = nxt[v][1];
            }
            cnt[v]++;
        }
    }
    
    void remove(int x) {
        int v = 0;
        cnt[v]--;
        for (int i = 30; i >= 0; i--) {
            if ((x & (1 << i)) == 0) {
                v = nxt[v][0];
            } else {
                v = nxt[v][1];
            }
            cnt[v]--;
        }
    }
    
    int search(int x) {
        int v = 0, res = 0;
        for (int i = 30; i >= 0; i--) {
            int t = (x & (1 << i)) == 0 ? 1 : 0;
            if (nxt[v][t] >= 0 && cnt[nxt[v][t]] > 0) {
                v = nxt[v][t];
                res |= 1 << i;
            } else {
                v = nxt[v][t ^ 1];
            }
        }
        return res;
    }
    
    
    public static void main(String[] args) {
        in = new FastScanner(new BufferedReader(new InputStreamReader(System.in)));
        out = new PrintWriter(System.out);
        new VasiliyMultiset().solve();
        out.close();
    }
    
    static FastScanner in;
    static PrintWriter out;
    
    static class FastScanner {
        BufferedReader in;
        StringTokenizer st;
        
        public FastScanner(BufferedReader in) {
            this.in = in;
        }
        
        public String nextToken() {
            while (st == null || !st.hasMoreTokens()) {
                try {
                    st = new StringTokenizer(in.readLine());
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            return st.nextToken();
        }
        
        public int nextInt() {
            return Integer.parseInt(nextToken());
        }
        
        public long nextLong() {
            return Long.parseLong(nextToken());
        }
        
        public double nextDouble() {
            return Double.parseDouble(nextToken());
        }
    }
}
