Cod sursa(job #1505049)

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

#define BUFFSIZE 65536

char buffer[BUFFSIZE];
int ptr = BUFFSIZE;

inline char GetChar(FILE *fin) {
  if ( ptr == BUFFSIZE ) {
    fread( buffer, 1, BUFFSIZE, fin );
    ptr = 0;
  }
  return buffer[ptr++];
}

inline int ReadInt(FILE *fin) {
  int q = 0;
  char c;

  do {
    c = GetChar(fin);
  } while ( !isdigit(c) );
  do {
    q = (10 * q) + (c - '0');
    c = GetChar(fin);
  } while ( isdigit(c) );
  return q;
}

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;

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