Pagini recente » Borderou de evaluare (job #996880) | Cod sursa (job #2327984) | Cod sursa (job #1287074) | Cod sursa (job #61917) | Cod sursa (job #1505049)
#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;
}