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 sys
from collections import Counter
readline = sys.stdin.readline

Q = int(readline())

D0 = set()
D1 = set()
geta = 36
def tadd(x):
    bx = [1 if s == '1' else 0 for s in (bin(x)[2:]).zfill(34)]
    cur = 0
    for i in range(34):
        b = bx[i]
        nw, dep = divmod(cur, geta)
        if b == 1:
            if cur in D1:
                cur = ((nw<<1)+1) * geta + dep+1
                continue
            D1.add(cur)
            cur = ((nw<<1)+1) * geta + dep+1
            continue
        else:
            if cur in D0:
                cur = (nw<<1)*geta + dep + 1
                continue
            
            D0.add(cur)
            cur = (nw<<1)*geta + dep + 1
            continue

def trem(x):
    cur = x*geta + 34
    for i in range(34-1, -1, -1):
        nw, dep = divmod(cur, geta)
        if nw&1:
            cur = (nw>>1)*geta + dep-1
            D1.remove(cur)
            if cur in D0:
                break
        else:
            cur = (nw>>1)*geta + dep-1
            D0.remove(cur)
            if cur in D1:
                break

def calc(x):
    bx = [1 if s == '1' else 0 for s in (bin(x)[2:]).zfill(34)]
    cur = 0
    for i in range(34):
        nw, dep = divmod(cur, geta)
        if bx[i] == 0:
            if cur in D1:
                cur = ((nw<<1)+1)*geta + dep+1
            else:
                cur = (nw<<1)*geta + dep+1
        else:
            if cur in D0:
                cur = (nw<<1)*geta + dep+1
            else:
                cur = ((nw<<1)+1)*geta + dep+1
    return (cur//geta)^x

C = Counter()
Ans = [] 
tadd(0)
for _ in range(Q):
    t, x = readline().split()
    x = int(x)
    if t == '+':
        C[x] += 1
        if C[x] == 1:
            tadd(x)
    elif t == '-':
        C[x] -= 1
        if C[x] == 0:
            trem(x)
    else:
        Ans.append(calc(x))

print('\n'.join(map(str, Ans)))