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>.
# -*- coding: utf-8 -*-

import math
import collections
import bisect
import heapq
import time
import random
import itertools
import sys
from typing import List

"""
created by shhuan at 2020/1/7 22:34

"""


class Node:
    def __init__(self):
        self.val = None
        self.left = None
        self.right = None

N = 32
tree = Node()


def binval(val):
    u = bin(val)[2:]
    return '0' * (N - len(u)) + u


def insert(val):
    u = binval(val)
    t = tree
    for v in u:
        if v == '1':
            if not t.left:
                t.left = Node()
            t = t.left
        else:
            if not t.right:
                t.right = Node()
            t = t.right
    t.val = val


def remove(val):
    u = binval(val)
    t = tree
    q = []
    for v in u:
        nt = t.left if v == '1' else t.right
        q.append((t, v))
        t = nt

    for t, v in reversed(q):
        ended = t.left and t.right
        if v == '1':
            t.left = None
        else:
            t.right = None
        if ended:
            break


def search(val):
    u = binval(((1 << N) - 1) ^ val)
    x = ''
    t = tree
    for v in u:
        if v == '1':
            if t.left:
                x += '1'
                t = t.left
            else:
                x += '0'
                t = t.right
        else:
            if t.right:
                x += '0'
                t = t.right
            else:
                x += '1'
                t = t.left
    return int(x, 2) ^ val


insert(0)
q = int(input())
wc = collections.defaultdict(int)
bwc = collections.defaultdict(set)
ans = []
for qi in range(q):
    a, b = input().split()
    v = int(b)
    if a == '+':
        wc[v] += 1
        if wc[v] == 1:
            insert(v)
    elif a == '-':
        wc[v] -= 1
        if wc[v] == 0:
            remove(v)
    else:
        ans.append(search(v))
print('\n'.join(map(str, ans)))
