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

public class TaskD {
	
	public static void main (String[] args) throws IOException {
		FastScanner fs = new FastScanner(System.in);
		PrintWriter pw = new PrintWriter(new BufferedOutputStream(System.out));
		
		int n = fs.nextInt();		
		Tree t = new Tree();		
		int[] b = new int[32];
		
		Tree r = t;
		for (int j = 31; j >= 0; j--) {
			r.c0 = new Tree();			
			r.c0.p = r;
			r.c++;
			r = r.c0;			
		}
		r.c++;
		
		for (int i = 0; i < n; i++) {
			String s = fs.next();
			int x = fs.nextInt();			
			for (int j = 0; j <= 31; j++) {
				b[j] = ((x&(1<<j))!=0) ? 1 : 0;
			}
			if (s.charAt(0) == '+') {
				r = t;
				for (int j = 31; j >= 0; j--) {
					if (b[j] == 0) {
						if (r.c0 == null)  {
							r.c0 = new Tree();							
							r.c0.p = r;
						}
						r = r.c0;
					} else {
						if (r.c1 == null)  {
							r.c1 = new Tree();							
							r.c1.p = r;
						}
						r = r.c1;
					}
				}
				while (r != t) {
					r.c++;
					r = r.p;	
				}
				r.c++;
			} else if (s.charAt(0) == '-') {
				r = t;
				for (int j = 31; j >= 0; j--) {
					r.c--;
					if (b[j] == 0) {						
						r = r.c0;
					} else {						
						r = r.c1;
					}
				}
				r.c--;				
			} else {				
				r = t;	
				for (int j = 31; j >= 0; j--) {
					if (b[j] == 0) {
						if (r.c1 != null && r.c1.c > 0) {
							b[j] = 1;
							r = r.c1;
						} else {
							r = r.c0;
						}
					} else {
						if (r.c0 != null && r.c0.c > 0) {
							r = r.c0;
						} else {
							b[j] = 0;
							r = r.c1;
						}
					}
				}
				int a = 0;
				for (int j = 0; j <= 31; j++) {
					if (b[j] == 1) {
						a |= (1<<j);
					}
				}
				pw.println(a);
			}			
		}
		pw.close();		
	}

	static class Tree {
		Tree p;
		Tree c0;
		Tree c1;		
		int c;
	}

	static class FastScanner {
        BufferedReader reader;
        StringTokenizer tokenizer;        
        FastScanner(InputStream i) {
            reader = new BufferedReader(new InputStreamReader(i));
            tokenizer = new StringTokenizer("");
        }
        String next() throws IOException {
            while(!tokenizer.hasMoreTokens()) tokenizer = new StringTokenizer(reader.readLine());
            return tokenizer.nextToken();
        }
        int nextInt() throws IOException {
            return Integer.parseInt(next());
        }        
    }
}