Cod sursa(job #1505047)

Utilizator bciobanuBogdan Ciobanu bciobanu Data 18 octombrie 2015 18:06:59
Problema Hashuri Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 2.33 kb
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

typedef struct Tr {
  int key, priority;
  struct Tr *left, *right;
} Treap;

Treap *R, *NIL;

bool TreapSearch(Treap *n, int key) {
  if ( n == NIL ) {
    return 0;
  }
  if ( key == n->key ) {
    return 1;
  }
  if ( key < n->key ) {
    return TreapSearch( n->left, key );
  } else {
    return TreapSearch( n->right, key );
  }
}

void rotLeft(Treap* &n) {
  Treap *T = n->left;
  n->left = T->right;
  T->right = n;
  n = T;
}

void rotRight(Treap* &n) {
  Treap *T = n->right;
  n->right = T->left;
  T->left = n;
  n = T;
}

void TreapBalance(Treap* &n) {
  if ( n->left->priority > n->priority ) {
    rotLeft( n );
  } else if ( n->right->priority > n->priority ) {
    rotRight( n );
  }
}

void TreapInsert(Treap* &n, int key, int priority) {
  if ( n == NIL ) {
    n = (Treap *) malloc( sizeof(Treap) );
    n->key = key;
    n->priority = priority;
    n->left = n->right = NIL;
  } else {
    if ( key < n->key ) {
      TreapInsert( n->left, key, priority );
    } else if ( key > n->key ) {
      TreapInsert( n->right, key, priority );
    }
    TreapBalance( n );
  }
}

void TreapErase(Treap *&n, int key) {
  if ( n == NIL ) {
    return;
  }
  if ( key < n->key ) {
    TreapErase( n->left, key );
  } else if ( key > n->key ) {
    TreapErase( n->right, key );
  } else {
    if ( n->left == NIL && n->right == NIL ) {
      free(n);
      n = NIL;
    } else {
      if ( n->left->priority > n->right->priority ) {
        rotLeft(n);
      } else {
        rotRight(n);
      }
      TreapErase(n, key);
    }
  }
}

int main(void) {
  FILE *fin = fopen("hashuri.in", "r");
  FILE *fout = fopen("hashuri.out", "w");
  int n;
  int opType, x;

  srand(time(0));

  R = NIL = (Treap *) malloc( sizeof(Treap) );
  R->key = NIL->key = R->priority = NIL->priority = 0;
  R->left = R->right = NIL->left = NIL->right = NULL;

  fscanf( fin, "%d", &n );
  while ( n-- ) {
    fscanf( fin, "%d%d", &opType, &x );
    if ( opType == 1 ) {
      TreapInsert( R, x, (rand() % 666013) + 1 );
    } else if ( opType == 2 ) {
      TreapErase( R, x );
    } else {
      fputc( '0' + TreapSearch( R, x ), fout );
      fputc( '\n', fout );
    }
  }
  fclose( fin );
  fclose( fout );
  return 0;
}