Pagini recente » Cod sursa (job #2193990) | Cod sursa (job #1790178) | Cod sursa (job #608879) | Cod sursa (job #354294) | Cod sursa (job #1254987)
#include <fstream>
#include <time.h>
#include <stdlib.h>
using namespace std;
class Treap {
public:
struct node {
int key, priority;
node *left, *right;
node(int _key, int _priority, node *_left, node* _right) {
key = _key;
priority = _priority;
left = _left;
right = _right;
}
} *nil, *root;
Treap() {
nil = new node(0, 0, NULL, NULL);
nil->left = nil->right = nil;
root = nil;
}
void Insert(int key, int priority) {
insert(root, key, priority);
}
void Erase(int key) {
erase(root, key);
}
bool Find(int key) {
return find(root, key);
}
private:
bool find(node *& tr, int key) {
if(tr == nil)
return false;
if(tr->key == key)
return true;
if(tr->key < key)
return find(tr->right, key);
return find(tr->left, key);
}
void rotateLeft(node *&x) {
node *aux = x->left;
x->left = aux->right;
aux->right = x;
x = aux;
}
void rotateRight(node *&y) {
node *aux = y->right;
y->right = aux->left;
aux->left = y;
y = aux;
}
void balance(node *&tr) {
if(tr->left->priority > tr->priority)
rotateLeft(tr);
else
rotateRight(tr);
}
void insert(node *&tr, int key, int priority) {
if(tr == nil) {
tr = new node(key, priority, nil, nil);
return;
}
if(tr->key == key)
return;
if(key < tr->key)
insert(tr->left, key, priority);
else
insert(tr->right, key, priority);
balance(tr);
}
void erase(node *&tr, int key) {
if(tr == nil)
return; // looks likie key wasn't there
if(tr->key == key) {
if(tr->left == nil && tr-> right == nil) {
delete tr;
tr = nil;
}
if(tr->left->priority > tr->right->priority) {
rotateLeft(tr);
erase(tr->right, key);
}
else {
rotateRight(tr);
erase(tr->left, key);
}
}
else {
if(tr->key > key)
erase(tr->left, key);
else
erase(tr->right, key);
}
}
};
int main() {
ifstream fin("hashuri.in");
ofstream fout("hashuri.out");
srand(time(NULL));
Treap T;
int M;
fin >> M;
while (M --) {
int op, x;
fin >> op >> x;
switch(op) {
case 1:
T.Insert(x, rand() + 1);
break;
case 2:
T.Erase(x);
break;
case 3:
fout << T.Find(x) << '\n';
break;
}
}
}