#include <stdio.h>
#include <ctype.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;
#define Dragoste 4096
int pos = Dragoste;
char buff[Dragoste];
char getChar(FILE *f) {
if (pos == Dragoste) {
fread(buff, 1, Dragoste, f);
pos = 0;
}
return buff[pos++];
}
int freef(FILE *f) {
int result = 0;
char c;
do {
c = getChar(f);
} while (!isdigit(c));
do {
result = (result << 3) + (result << 1) + c - '0';
c = getChar(f);
} while (isdigit(c));
return result;
}
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);
N=freef(f);
//fprintf(stderr,"%d\n",N);
while (N) {
//fscanf(f, "%d", &task);
task=freef(f);
// n++;
// fprintf(stderr, "SUntem la %d -> %d\n",n,task);
switch (task) {
case 1:
val=freef(f);
//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:
val = save[freef(f)];
/*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;
}