Pagini recente » Cod sursa (job #1054749) | Cod sursa (job #1457053) | Cod sursa (job #2462544) | Cod sursa (job #3197528) | Cod sursa (job #1704055)
#include <stdio.h>
#define Nadejde 200000
#define MAX_BIT 30
#define NIL -1
int N, ptr;
int save[Nadejde + 1];
int trie[2][Nadejde * MAX_BIT + 1];
void init() {
ptr = 1;
trie[0][0] = trie[1][0] = NIL;
}
void insert(int x) {
int i, bit, nod = 0;
for (i = MAX_BIT - 1; i >= 0; i--) {
bit = (x >> i) & 1;
if (trie[bit][nod] == NIL) {
trie[0][ptr] = trie[1][ptr] = NIL;
trie[bit][nod] = ptr;
ptr++;
}
nod = trie[bit][nod];
}
}
int erase(int nod, int x, int bit) {
if (bit == 0) {
trie[x & 1][nod] = NIL;
} else {
int next = (x >> bit) & 1;
if (erase(trie[next][nod], x, bit - 1)) {
trie[next][nod] = NIL;
}
}
return nod != 0 && trie[0][nod] == NIL && trie[1][nod] == NIL;
}
int search(int result = 0) {
int i, nod = 0;
for (i = MAX_BIT - 1; i >= 0; i--) {
if (trie[0][nod] != NIL) {
nod = trie[0][nod];
} else {
nod = trie[1][nod];
result |= (1 << i);
}
}
return result;
}
int main(void) {
int task, val, pos = 0;
FILE *f = fopen("heapuri.in", "r");
freopen("heapuri.out", "w", stdout);
init();
fscanf(f, "%d", &N);
while (N) {
fscanf(f, "%d", &task);
switch (task) {
case 1:
fscanf(f, "%d", &val);
pos++;
save[pos] = val;
insert(val);
break;
case 2:
fscanf(f, "%d", &val);
val = save[val];
erase(0, val, MAX_BIT - 1);
break;
case 3:
fprintf(stdout, "%d\n", search());
}
N--;
}
fclose(f);
fclose(stdout);
/// Multumim Doamne!
puts("Doamne ajuta!");
return 0;
}