#include <bits/stdc++.h>
long long int powermod(long long int _a, long long int _b) {
  long long int _r = 1;
  while (_b) {
    if (_b % 2 == 1) _r = (_r * _a);
    _b /= 2;
    _a = (_a * _a);
  }
  return _r;
}
using namespace std;
void scan(int& x);
struct node {
  node* next[2];
} * root;
int flag = 1;
node* create(node* pss) {
  pss = new node();
  (*pss).next[0] = (*pss).next[1] = NULL;
  return pss;
}
void init() {
  root = create(root);
  node* curr = root;
  for (int i = 0; i < 31; i++) {
    node* tmp = create(tmp);
    (*curr).next[0] = tmp;
    curr = tmp;
  }
}
void add(int num) {
  node* curr = root;
  for (int i = 30; i >= 0; i--) {
    int target = (1 << i) & num;
    if (target > 0) target = 1;
    if ((*curr).next[target] == NULL) {
      node* tmp = create(tmp);
      (*curr).next[target] = tmp;
    }
    curr = (*curr).next[target];
  }
}
int get(int num) {
  node* curr = root;
  int res = 0;
  for (int i = 30; i >= 0; i--) {
    int target = (1 << i) & num;
    if (target > 0)
      target = 0;
    else
      target = 1;
    if ((*curr).next[target] != NULL) {
      curr = (*curr).next[target];
      res += (1 << i);
    } else
      curr = (*curr).next[target == 0 ? 1 : 0];
  }
  return res;
}
void rem(node* curr, int num, int pos) {
  if (pos < 0) {
    delete curr;
    curr = NULL;
    return;
  }
  int mt, dt;
  mt = (1 << pos) & num;
  if (mt > 0) mt = 1;
  dt = mt == 1 ? 0 : 1;
  rem((*curr).next[mt], num, pos - 1);
  if (flag) (*curr).next[mt] = NULL;
  if (flag && (*curr).next[dt] != NULL) flag = 0;
  if (flag) {
    delete curr;
    curr = NULL;
  }
}
int main(void) {
  init();
  int q;
  cin >> q;
  map<int, int> mp;
  while (q--) {
    string k;
    cin >> k;
    int x;
    scan(x);
    char c = k[0];
    if (c == '+') {
      add(x);
      mp[x]++;
    } else if (c == '-') {
      flag = 1;
      mp[x]--;
      if (mp[x] == 0) rem(root, x, 30);
    } else if (c == '?') {
      printf("%d\n", get(x));
    }
  }
  return 0;
}
void scan(int& x) {
  register int c = getchar();
  x = 0;
  int neg = 0;
  for (; ((c < 48 || c > 57) && c != '-'); c = getchar())
    ;
  if (c == '-') {
    neg = 1;
    c = getchar();
  }
  for (; c > 47 && c < 58; c = getchar()) {
    x = (x << 1) + (x << 3) + c - 48;
  }
  if (neg) x = -x;
}

### Prompt

Develop a solution in Cpp to the problem described below:

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

### Response

```cpp
#include <bits/stdc++.h>
long long int powermod(long long int _a, long long int _b) {
  long long int _r = 1;
  while (_b) {
    if (_b % 2 == 1) _r = (_r * _a);
    _b /= 2;
    _a = (_a * _a);
  }
  return _r;
}
using namespace std;
void scan(int& x);
struct node {
  node* next[2];
} * root;
int flag = 1;
node* create(node* pss) {
  pss = new node();
  (*pss).next[0] = (*pss).next[1] = NULL;
  return pss;
}
void init() {
  root = create(root);
  node* curr = root;
  for (int i = 0; i < 31; i++) {
    node* tmp = create(tmp);
    (*curr).next[0] = tmp;
    curr = tmp;
  }
}
void add(int num) {
  node* curr = root;
  for (int i = 30; i >= 0; i--) {
    int target = (1 << i) & num;
    if (target > 0) target = 1;
    if ((*curr).next[target] == NULL) {
      node* tmp = create(tmp);
      (*curr).next[target] = tmp;
    }
    curr = (*curr).next[target];
  }
}
int get(int num) {
  node* curr = root;
  int res = 0;
  for (int i = 30; i >= 0; i--) {
    int target = (1 << i) & num;
    if (target > 0)
      target = 0;
    else
      target = 1;
    if ((*curr).next[target] != NULL) {
      curr = (*curr).next[target];
      res += (1 << i);
    } else
      curr = (*curr).next[target == 0 ? 1 : 0];
  }
  return res;
}
void rem(node* curr, int num, int pos) {
  if (pos < 0) {
    delete curr;
    curr = NULL;
    return;
  }
  int mt, dt;
  mt = (1 << pos) & num;
  if (mt > 0) mt = 1;
  dt = mt == 1 ? 0 : 1;
  rem((*curr).next[mt], num, pos - 1);
  if (flag) (*curr).next[mt] = NULL;
  if (flag && (*curr).next[dt] != NULL) flag = 0;
  if (flag) {
    delete curr;
    curr = NULL;
  }
}
int main(void) {
  init();
  int q;
  cin >> q;
  map<int, int> mp;
  while (q--) {
    string k;
    cin >> k;
    int x;
    scan(x);
    char c = k[0];
    if (c == '+') {
      add(x);
      mp[x]++;
    } else if (c == '-') {
      flag = 1;
      mp[x]--;
      if (mp[x] == 0) rem(root, x, 30);
    } else if (c == '?') {
      printf("%d\n", get(x));
    }
  }
  return 0;
}
void scan(int& x) {
  register int c = getchar();
  x = 0;
  int neg = 0;
  for (; ((c < 48 || c > 57) && c != '-'); c = getchar())
    ;
  if (c == '-') {
    neg = 1;
    c = getchar();
  }
  for (; c > 47 && c < 58; c = getchar()) {
    x = (x << 1) + (x << 3) + c - 48;
  }
  if (neg) x = -x;
}

```