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>.
class node:
    def __init__(self,data):
        self.data=data
        self.right=None
        self.left=None
        self.count=0
        self.val=0
class trie:
    def __init__(self):
        self.root=node(0)
    def insert(self,data):
        self.temp=self.root
        for i in data:
            if i=="0" and self.temp.left:
                self.temp=self.temp.left
            elif i=="0" and not self.temp.left:
                self.temp.left=node("0")
                self.temp=self.temp.left
            if i=="1" and self.temp.right:
                self.temp=self.temp.right
            elif i=="1" and not self.temp.right:
                self.temp.right=node("1")
                self.temp=self.temp.right
            self.temp.count+=1
        self.temp.val=int(data,2)
    def remove(self,data):
        self.temp=self.root
        for i in data:
            if i=="0" :
                self.temp=self.temp.left
            elif i=="1" :
                self.temp=self.temp.right
            self.temp.count-=1
    def xor(self,data):
        self.temp=self.root
        for i in data:
            if i=="0" and self.temp.right and self.temp.right.count>0:
                self.temp=self.temp.right
            elif i=="0" and (not self.temp.right or self.temp.right.count==0):
                self.temp=self.temp.left
            if i=="1" and self.temp.left and self.temp.left.count>0:
                self.temp=self.temp.left
            elif i=="1" and (not self.temp.left or self.temp.left.count==0):
                self.temp=self.temp.right
        return int(data,2)^self.temp.val
q=int(input())
t=trie()
t.insert(bin(0)[2:].rjust(30,"0"))
for _ in range(q):
    u,x=str(input()).split()
    x=int(x)
    binx = (bin(x)[2:]).rjust(30, "0")
    if u=="+":
        t.insert(data=binx)
    if u=="-":
        t.remove(data=binx)
    if u=="?":
        print(t.xor(binx))


