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 java.io.*;

public class CF706D {
	static class T {
		T c0, c1;
		int n0, n1, k, x;
		T(int k) {
			this.k = k;
		}
		void add(int x) {
			if (k >= 0) {
				if ((x & 1 << k) == 0) {
					if (n0++ == 0)
						c0 = new T(k - 1);
					c0.add(x);
				} else {
					if (n1++ == 0)
						c1 = new T(k - 1);
					c1.add(x);
				}
			} else
				this.x = x;
		}
		void remove(int x) {
			if (k >= 0) {
				if ((x & 1 << k) == 0) {
					c0.remove(x);
					if (--n0 == 0)
						c0 = null;
				} else {
					c1.remove(x);
					if (--n1 == 0)
						c1 = null;
				}
			}
		}
		int find(int x) {
			if (k >= 0) {
				if ((x & 1 << k) == 0 && c1 != null)
					return c1.find(x);
				if ((x & 1 << k) != 0 && c0 != null)
					return c0.find(x);
				return c0 != null ? c0.find(x) : c1.find(x);
			} else
				return this.x ^ x;
		}
	}
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		int q = Integer.parseInt(br.readLine());
		T t = new T(29);
		t.add(0);
		PrintWriter pw = new PrintWriter(System.out);
		while (q-- > 0) {
			String s = br.readLine();
			char c = s.charAt(0);
			int x = Integer.parseInt(s.substring(2));
			if (c == '+')
				t.add(x);
			else if (c == '-')
				t.remove(x);
			else
				pw.println(t.find(x));
		}
		pw.close();
	}
}
