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 static java.lang.System.*;

import java.util.*;

public class Vasiliy 
{
	public static void main(String[]args)
	{
		Scanner in = new Scanner(System.in);
		int times = in.nextInt();
		Tri base = new Tri('0');
		String bin = String.format("%32s", Integer.toBinaryString(0)).replace(' ', '0');
		Tri pointless = base;
		for(int b = 0; b < bin.length(); b++)
		{
			pointless.left = new Tri('0');
			pointless = pointless.left;
			pointless.count++;
		}
		for(int a =0; a<times;a++)
		{
			Tri temp = base;
			char parse = in.next().charAt(0);
			int number = in.nextInt();
			if(parse == '-')
			{
				String toBinary = String.format("%32s", Integer.toBinaryString(number)).replace(' ', '0');
				for(int b = 0; b < toBinary.length(); b++)
				{
					char dir = toBinary.charAt(b);
					if(dir == '0')
					{
						temp = temp.left;
					}
					else
					{
						temp = temp.right;
					}
					temp.count--;
				}
				//temp.count--;
			}
			else if(parse == '+')
			{
				String toBinary = String.format("%32s", Integer.toBinaryString(number)).replace(' ', '0');
				for(int b = 0; b < toBinary.length(); b++)
				{
					char dir = toBinary.charAt(b);
					if(dir == '0')
					{
						if(temp.left != null)
						{
							temp = temp.left;
						}
						else
						{
							temp.left = new Tri(dir);
							temp = temp.left;
						}
					}
					else
					{
						if(temp.right != null)
						{
							temp = temp.right;
						}
						else
						{
							temp.right = new Tri(dir);
							temp = temp.right;
						}
					}
					temp.count++;
				}
				//temp.count++;
			}
			else if(parse == '?')
			{
				String toBinary = String.format("%32s", Integer.toBinaryString(number)).replace(' ', '0');
				String builder = "";
				for(int b =0; b < toBinary.length(); b++)
				{
					char dir = toBinary.charAt(b);
					if(dir == '0')
					{
						if(temp.right != null)
						{
							if(temp.right.count > 0)
							{
								builder += "1";
								temp = temp.right;
							}
							else
							{
								builder += "0";
								temp = temp.left;
							}
						}
						else
						{
							builder += "0";
							temp = temp.left;
						}
					}
					else
					{
						if(temp.left != null)
						{
							if(temp.left.count > 0)
							{
								builder += "0";
								temp = temp.left;
							}
							else
							{
								builder += "1";
								temp = temp.right;
							}
						}
						else
						{
							builder += "1";
							temp = temp.right;
						}
					}
				}
				out.println(number ^ Integer.parseInt(builder, 2));
			}
		}
	}
}
class Tri
{
	char symbol;
	Tri left;
	Tri right;
	int count;
    public Tri(char in)
    {
    	symbol = in;
    	left = null;
    	right = null;
    	count = 0;
    }
}