#include <stdio.h>
#include <assert.h>
#include <stdlib.h>
#define Nadejde 200000
#define MAX_BIT 30
#define NIL -1
struct trie {
trie *son[2];
trie() {
son[0] = son[1] = NULL;
}
};
int N, ptr;
int save[Nadejde + 1];
trie *root;
void init() {
root = new trie;
}
void insert(trie *nod, int x, int bit) {
if (bit != NIL) {
int next = (x >> bit) & 1;
if (nod -> son[next] == NULL) {
nod -> son[next] = new trie;
}
insert(nod -> son[next], x, bit - 1);
}
}
int erase(trie *nod, int x, int bit) {
if (bit != NIL) {
int next = (x >> bit) & 1;
if (erase(nod -> son[next], x, bit - 1)) {
nod -> son[next] = NULL;
}
}
if (nod != root && nod -> son[0] == NULL && nod -> son[1] == NULL) {
delete nod;
return 1;
} else {
return 0;
}
}
int search(trie *nod, int bit, int result = 0) {
if (bit == NIL) {
return result;
}
if (nod -> son[0] != NULL) {
return search(nod -> son[0], bit - 1, result);
} else {
//assert(nod -> son[1] != NULL);
return search(nod -> son[1], bit - 1, result | (1 << bit));
}
}
bool find(trie *nod, int x, int bit) {
if (bit == NIL) {
return 1;
} else {
int next = (x >> bit) & 1;
if (nod -> son[next] != NULL) {
return find(nod->son[next],x,bit-1);
}
return 0;
}
}
int main(void) {
int task, val, pos = 0;
FILE *f = fopen("heapuri.in", "r");
freopen("heapuri.out", "w", stdout);
/*FILE *ok = fopen("check.in", "r");
int check;
*/
init();
//int line = 0;
//int n=0;
fscanf(f, "%d", &N);
while (N) {
fscanf(f, "%d", &task);
// n++;
// fprintf(stderr, "SUntem la %d -> %d\n",n,task);
switch (task) {
case 1:
fscanf(f, "%d", &val);
pos++;
save[pos] = val;
insert(root, val, MAX_BIT - 1);
//fprintf(stderr,"%d\n",find(root,val,MAX_BIT-1));
break;
case 2:
fscanf(f, "%d", &val);
val = save[val];
/*if (val==13){
fprintf(stderr,"aoleu!");
}*/
// fprintf(stderr,"zi: %d->%d\n",find(root,val,MAX_BIT-1),val);
//assert(find(root,val,MAX_BIT-1));
if (find(root,val,MAX_BIT-1))
erase(root, val, MAX_BIT - 1);
/// fprintf(stderr,"zi: %d\n",find(root,val,MAX_BIT-1));
break;
case 3:
fprintf(stdout, "%d\n", search(root, MAX_BIT - 1));
/*fscanf(ok, "%d", &check);
line++;
if (n==620){
fprintf(stderr,"acum===%d->liina=%d\n",val,line);
}
if (check != val) {
fprintf(stderr, "error = la linia %d -> %d\n", line, n);
exit(0);
assert(0);
}*/
//assert(check == val);
}
// fprintf(stderr, "amin");
N--;
}
fclose(f);
fclose(stdout);
/// Multumim Doamne!
puts("Doamne ajuta!");
return 0;
}