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.Scanner;

public class Eight {
    public static class Node {
        Node[] children;
        int done;
        char c;
        int count;
        public Node(char c) {
            this.c = c;
            done = 0;
            children = new Node[2];
            count = 1;
        }

    }
    public static void main(String[] args) {
        Node trie = new Node('r');
        // insert 0 cuz always has 0
        op("+", 0, trie);
        Scanner s = new Scanner(System.in);
        int numQueries = s.nextInt();
        for (int i = 0; i < numQueries; i++) {
            String op = s.next();
            int num = s.nextInt();
            op(op, num, trie);
        }
    }

    private static void op(String op, int num, Node trie) {
        switch(op) {
            case "+": {
                StringBuilder b = getBinaryNum(num);
                Node current = trie;
                for (int j = 0; j < b.length(); j++) {
                    int index = b.charAt(j) - '0';
                    if (current.children[index] == null) {
                        current.children[index] = new Node(b.charAt(j));
                    } else {
                        current.children[index].count++;
                    }
                    current = current.children[index];
                }
                current.done++;
                break;
            }
            case "-": {
                StringBuilder b = getBinaryNum(num);
                Node current = trie;
                for (int j = 0; j < b.length(); j++) {
                    int index = b.charAt(j) - '0';
                    current.children[index].count--;
                    if (current.children[index].count == 0) {
                        current.children[index] = null;
                        break;
                    }
                    current = current.children[index];
                }
                break;
            }
            case "?": {
                StringBuilder b = getBinaryNum(num);
                StringBuilder sb = new StringBuilder();
                Node current = trie;
                for (int j = 0; j < b.length(); j++) {
                    char c = (b.charAt(j) == '1' ? '0' : '1');
                    int index = c - '0';
                    if (current.children[index] != null) {
                        sb.append(c);
                        current = current.children[index];
                    } else {
                        sb.append(b.charAt(j));
                        current = current.children[1 - index];
                    }
                }
                System.out.println((Integer.parseInt(sb.toString(), 2))^num);
                break;
            }
        }
    }

    private static StringBuilder getBinaryNum(int num) {
        StringBuilder bin = new StringBuilder(Integer.toBinaryString(num));
        StringBuilder rest = new StringBuilder();
        for (int k = 0; k < 32 - bin.length(); k++) {
            rest.append("0");
        }
        return rest.append(bin);
    }
}
