Cod sursa(job #1712132)

Utilizator stoianmihailStoian Mihail stoianmihail Data 2 iunie 2016 09:32:09
Problema Hashuri Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 2.35 kb
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

const char code[2][2] = {"0", "1"};

struct treap {
  int key;
  int priority;
  treap *left;
  treap *right;

  treap() {
  
  }

  treap(int key, int priority, treap *left, treap *right) {
    this -> key = key;
    this -> priority = priority;
    this -> left = left;
    this -> right = right;
  }
};

treap *root, *NIL;

void init() {
  srand(unsigned(time(NULL)));
  NIL = new treap{0, 0, NULL, NULL};
  root = NIL;
}

void rotLeft(treap* &node) {
  treap *tmp = node -> left;
  node -> left = tmp -> right;
  tmp -> right = node;
  node = tmp;
}

void rotRight(treap* &node) {
  treap *tmp = node -> right;;
  node -> right = tmp -> left;
  tmp -> left = node;
  node = tmp;
}

void balance(treap* &node) {
  if (node -> left -> priority > node -> priority) {
    rotLeft(node);
  } else if (node -> right -> priority > node -> priority) {
    rotRight(node);
  }
}

void insert(treap* &node, int key, int priority) {
  if (node == NIL) {
    node = new treap(key, priority, NIL, NIL);
    return;
  }
  if (key < node -> key) {
    insert(node -> left, key, priority);
  } else if (node -> key < key) {
    insert(node -> right, key, priority);
  }
  balance(node);
}

void erase(treap* &node, int key) {
  if (node == NIL) {
    return;
  }
  if (key < node -> key) {
    erase(node -> left, key);
  } else if (node -> key < key) {
    erase(node -> right, key);
  } else {
    if (node -> left == NIL && node -> right == NIL) {
      node = NIL;
    } else {
      if (node -> left -> priority > node -> right -> priority) {
        rotLeft(node);
      } else {
        rotRight(node);
      }
      erase(node, key);
    }
  }
}

int search(treap* &node, int key) {
  if (node == NIL) {
    return 0;
  }
  if (key == node -> key) {
    return 1;
  }
  if (key < node -> key) {
    return search(node -> left, key);
  } else {
    return search(node -> right, key);
  }
}

int main(void) {
  int N, task, x;
  FILE *f = fopen("hashuri.in", "r");
  freopen("hashuri.out", "w", stdout);

  init();

  fscanf(f, "%d", &N);
  while (N) {
    fscanf(f, "%d %d", &task, &x);
    if (task == 1) {
      insert(root, x, rand() + 1);
    } else if (task == 2) {
      erase(root, x);
    } else {
      puts(code[search(root, x)]);
    }
    N--;
  }
  fclose(f);
  fclose(stdout);

  /// Multumim Doamne!
  puts("Doamne ajuta!");
  return 0;
}