Cod sursa(job #1704055)

Utilizator stoianmihailStoian Mihail stoianmihail Data 17 mai 2016 22:45:04
Problema Heapuri Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.58 kb
#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;
}