#include <bits/stdc++.h>   using namespace std;   const int MAXN = (int)2e5 + 7;   const int INF = (int)1e9 + 7;   const long long LINF = (long long)1e12 + 7;   const int MOD = (int)1e9 + 7;   void file() {}   inline int readChar();   template <class T = int>   inline T readInt();   template <class Tl = long long>   inline Tl readLong();   template <class T>   inline void writeInt(T x, char end = 0);   template <class Tl>   inline void writeLong(Tl x, char end = 0);   inline void writeChar(int x);   inline void writeWord(const char *s);   static const int buf_size = 4096;   inline int getChar() {     static char buf[buf_size];     static int len = 0, pos = 0;     if (pos == len) pos = 0, len = fread(buf, 1, buf_size, stdin);     if (pos == len) return -1;     return buf[pos++];   }   inline int readChar() {     int c = getChar();     while (c <= 32) c = getChar();     return c;   }   template <class T>   inline T readInt() {     int s = 1, c = readChar();     T x = 0;     if (c ==  - ) s = -1, c = getChar();     while ( 0  <= c && c <=  9 ) x = x * 10 + c -  0 , c = getChar();     return s == 1 ? x : -x;   }   template <class Tl>   inline Tl readLong() {     int s = 1, c = readChar();     Tl x = 0;     if (c ==  - ) s = -1, c = getChar();     while ( 0  <= c && c <=  9 ) x = x * 10 + c -  0 , c = getChar();     return s == 1 ? x : -x;   }   static int write_pos = 0;   static char write_buf[buf_size];   inline void writeChar(int x) {     if (write_pos == buf_size)       fwrite(write_buf, 1, buf_size, stdout), write_pos = 0;     write_buf[write_pos++] = x;   }   template <class T>   inline void writeInt(T x, char end) {     if (x < 0) writeChar( - ), x = -x;     char s[24];     int n = 0;     while (x || !n) s[n++] =  0  + x % 10, x /= 10;     while (n--) writeChar(s[n]);     if (end) writeChar(end);   }   template <class Tl>   inline void writeLong(Tl x, char end) {     if (x < 0) writeChar( - ), x = -x;     char s[24];     int n = 0;     while (x || !n) s[n++] =  0  + x % 10, x /= 10;     while (n--) writeChar(s[n]);     if (end) writeChar(end);   }   inline void writeWord(const char *s) {     while (*s) writeChar(*s++);   }   struct Flusher {     ~Flusher() {       if (write_pos) fwrite(write_buf, 1, write_pos, stdout), write_pos = 0;     }   } flusher;   vector<vector<int> > G;   vector<pair<int, int> > p;   vector<int> coun;   void insert(int x) {     int v = 0;     for (int i = 30; i >= 0; --i) {       ++coun[v];       if (G[v][(x >> i) & 1] == -1) {         G.push_back(vector<int>(2, -1));         coun.push_back(0);         p.push_back({v, (x >> i) & 1});         G[v][(x >> i) & 1] = G.size() - 1;       }       v = G[v][(x >> i) & 1];     }     ++coun[v];   }   void erase(int x) {     int v = 0;     for (int i = 30; i >= 0; --i) {       --coun[v];       v = G[v][(x >> i) & 1];     }     --coun[v];     while (p[v].first != -1 && !coun[v]) {       G[p[v].first][p[v].second] = -1;       v = p[v].first;     }   }   int get(int x) {     int ans = 0, v = 0;     for (int i = 30; i >= 0; --i) {       if (G[v][(x >> i) & 1] != -1) {         if ((x >> i) & 1) {           ans += (1 << i);         }         v = G[v][(x >> i) & 1];       } else {         if (!((x >> i) & 1)) {           ans += (1 << i);         }         v = G[v][!((x >> i) & 1)];       }     }     return ans;   }   int main() {     file();     int q = readInt();     G.push_back(vector<int>(2, -1));     coun.push_back(0);     p.push_back({-1, 0});     insert(0);     while (q--) {       char c = readChar();       int x = readInt();       if (c ==  + ) {         insert(x);       }       if (c ==  - ) {         erase(x);       }       if (c ==  ? ) {         int cur = x ^ ((1ll << 31) - 1);         int ans = get(cur) ^ x;         writeInt(ans,   n );       }     }     return 0;   }