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>.
trie = [[-1, -1]]
counts = [0]
trie_size = 1

def insert(x):
    global trie, counts, trie_size

    node = 0
    out = []
    for i in range(30, -1, -1):
        b = 0 if (x & (1 << i)) == 0 else 1
        out.append(str(b))
        if trie[node][b] == -1:
            trie[node][b] = trie_size
            trie.append([-1, -1])
            counts.append(0)
            trie_size += 1

        counts[node] += 1
        node = trie[node][b]

    counts[node] += 1
    # print('+', ''.join(out))

def remove(x):
    global trie, counts, trie_size
    node = 0
    for i in range(30, -1, -1):
        counts[node] -= 1

        b = 0 if (x & (1 << i)) == 0 else 1
        node = trie[node][b]

    counts[node] -= 1

def query(x):
    global trie, counts, trie_size
    node = 0
    ans = 0

    out = []
    path = []
    for i in range(30, -1, -1):
        b = 0 if (x & (1 << i)) == 0 else 1
        out.append(str(b))

        if trie[node][1 - b] == -1 or counts[trie[node][1 - b]] == 0:
            node = trie[node][b]
            ans |= (1 << i) * b
            path.append(str(b))
        else:
            node = trie[node][1 - b]
            ans |= (1 << i) * (1 - b)
            path.append(str(1-b))

    # print(''.join(out))
    # print('path', ''.join(path))
    return ans ^ x

def main():
    q = int(input())
    insert(0)
    for _ in range(q):
        # print(trie)
        # print(counts)

        a, b = input().split()
        b = int(b)
        if a == '+':
            insert(b)
        elif a == '-':
            remove(b)
        else:
            print(query(b))

main()
