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.*;
import java.lang.*;
public class Solution {
    public static void main(String args[]) throws Exception {
        InputReader fi = new InputReader(System.in);
        PrintWriter out = new PrintWriter(System.out);
        int n=fi.nextInt();
        Trie tr=new Trie(n);
        tr.add(0);
        while (n-- > 0){
            char inst=fi.readString().charAt(0);
            int d=fi.nextInt();
            if (inst=='+') tr.add(d);
            else if(inst=='-') tr.delete(d);
            else {
                int query=tr.query(d);
                out.println(query);
            }
        }
        out.close();
    }

    static class Trie {
        static int maxn;
        static int[][] child;
        static int[] val;
        static int sz;

        Trie(int n) {
            maxn=30*n+2;
            child = new int[maxn][2];
            val = new int[maxn];
            sz = 1;
        }

        static void add(int x) {
            int pos = 0;
            for (int i = 30; i >= 0; i--) {
                int id = ((x >> i) & 1) > 0 ?1 : 0;
                 if (child[pos][id] == 0) {
                    child[pos][id] = sz++;
                }
                pos = child[pos][id];
                ++val[pos];
            }
        }
        static void delete(int x){
            int pos=0;
            for (int i=30;i>=0;i--){
                int id=(x&(1<<i)) > 0 ? 1 : 0;
                pos=child[pos][id];
                val[pos]--;
            }
        }

        static int query(int x){
            int pos=0;
            int ans=0;
            for (int i=30;i>=0;i--){
                int id=(x&(1<<i)) > 0 ? 1 : 0;
                if (id==1){
                    //we have 1 check for zero I guess
                    if (child[pos][0]>0 && val[child[pos][0]] > 0){
                        ans+=1<<i;
                        pos=child[pos][0];
                    }
                    else pos=child[pos][1];
                }
                else if (id==0){
                        if (child[pos][1] > 0 && val[child[pos][1]]>0){
                            ans+=1<<i;
                            pos=child[pos][1];
                        }
                        else pos=child[pos][0];
                }
            }
            return ans;
        }
        void print() {
            int i, j;
            for (i = 0; i < maxn; i++) {
                for (j = 0; j < 2; j++) {
                    if (child[i][j] > 0)
                        System.out.println(" i = " + i + " j =  " + j + " child " + child[i][j]);
                }
            }
            for (i = 0; i < maxn; i++) {
                if (val[i] > 0)
                    System.out.println(" i = " + i + " val  " + val[i]);
            }
        }
    }
}
class InputReader {
    private InputStream stream;
    private byte[] buf = new byte[8192];
    private int curChar, snumChars;
    private SpaceCharFilter filter;

    public InputReader(InputStream stream) {
        this.stream = stream;
    }

    public int snext() {
        if (snumChars == -1)
            throw new InputMismatchException();
        if (curChar >= snumChars) {
            curChar = 0;
            try {
                snumChars = stream.read(buf);
            } catch (IOException e) {
                throw new InputMismatchException();
            }
            if (snumChars <= 0)
                return -1;
        }
        return buf[curChar++];
    }

    public int nextInt() {
        int c = snext();
        while (isSpaceChar(c))
            c = snext();
        int sgn = 1;
        if (c == '-') {
            sgn = -1;
            c = snext();
        }
        int res = 0;
        do {
            if (c < '0' || c > '9')
                throw new InputMismatchException();
            res *= 10;
            res += c - '0';
            c = snext();
        } while (!isSpaceChar(c));
        return res * sgn;
    }

    public long nextLong() {
        int c = snext();
        while (isSpaceChar(c))
            c = snext();
        int sgn = 1;
        if (c == '-') {
            sgn = -1;
            c = snext();
        }
        long res = 0;
        do {
            if (c < '0' || c > '9')
                throw new InputMismatchException();
            res *= 10;
            res += c - '0';
            c = snext();
        } while (!isSpaceChar(c));
        return res * sgn;
    }

    public int[] nextIntArray(int n) {
        int a[] = new int[n+1];
        for (int i = 1; i <= n; i++)
            a[i] = nextInt();
        return a;
    }

    public String readString() {
        int c = snext();
        while (isSpaceChar(c))
            c = snext();
        StringBuilder res = new StringBuilder();
        do {
            res.appendCodePoint(c);
            c = snext();
        } while (!isSpaceChar(c));
        return res.toString();
    }

    public boolean isSpaceChar(int c) {
        if (filter != null)
            return filter.isSpaceChar(c);
        return c == ' ' || c == '\n' || c == '\r' || c == '\t' || c == -1;
    }

    public interface SpaceCharFilter {
        public boolean isSpaceChar(int ch);
    }
}

