#include <bits/stdc++.h>
using namespace std;
#define fast ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
#define ll long long
#define all(v) v.begin(),v.end()
#define F first
#define S second
#define pb push_back
#define mp make_pair
#define pi pair<int,int>
#define REP(i,n) for(int i=0;i<n;i++)
const int N = 2e5+2;
int id = 0;
int nxt[3*N][2];
map<int,int> m;
int bit(int x,int p){
return ((x&(1<<p)) > 0 ? 1 : 0);
}
void add(int x){
int node = 0;
for(int i=30;i>=0;--i){
if(nxt[node][bit(x,i)]==0){
nxt[node][bit(x,i)] = ++id;
}
node = nxt[node][bit(x,i)];
}
}
void remove(int x){
int node = 0, z = 30, y = 0;
for(int i=30;i>=0;--i){
if(nxt[node][0]!=0 and nxt[node][1]!=0){
y = node;
z = i;
}
node = nxt[node][bit(x,i)];
}
for(int i=z;i>=0;--i){
int temp = y;
y = nxt[y][bit(x,i)];
nxt[temp][bit(x,i)] = 0;
}
}
void get(int x){
int node = 0,val = 0;
for(int i=30;i>=0;--i){
if(bit(x,i)>0 and nxt[node][0]!=0){
node = nxt[node][0];
val+=(1<<i);
}
else if(bit(x,i)==0 and nxt[node][1]!=0){
node = nxt[node][1];
val+=(1<<i);
}
else
node = nxt[node][bit(x,i)];
}
cout<<val<<"\n";
}
void run_case(){
int q,x;
char op;
cin >> q;
add(0);
while(q--){
cin >> op >> x;
if(op=='+'){
++m[x];
if(m[x]==1)
add(x);
}
else if(op=='-'){
--m[x];
if(m[x]==0)
remove(x);
}
else
get(x);
}
}
int main(){
fast;
int t=1;
while(t--){
run_case();
}
}