Pagini recente » Cod sursa (job #1965623) | Cod sursa (job #2784451) | Cod sursa (job #360343) | Cod sursa (job #1178209) | Cod sursa (job #1712132)
#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;
}