Cod sursa(job #1704074)

Utilizator stoianmihailStoian Mihail stoianmihail Data 17 mai 2016 23:39:59
Problema Heapuri Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 2.78 kb
#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;
}