Pagini recente » Cod sursa (job #120253) | Cod sursa (job #1496174) | Cod sursa (job #432007) | Cod sursa (job #565945) | Cod sursa (job #1197271)
#include <iostream>
#include <fstream>
#include <stdlib.h>
#include <time.h>
using namespace std;
class Treap {
public:
struct Node {
Node *left, *right;
int value, priority;
Node(Node *_left, Node *_right,int _value, int _priority) {
left = _left;
right = _right;
value = _value;
priority = _priority;
}
};
Node *root, *nil;
Treap() {
srand(time(NULL));
nil = new Node(0, 0, 0, 0);
nil->left = nil->right = nil;
root = nil;
}
void insert(int _value) {
_insert(root, _value, rand() + 1);
}
void erase(int _value) {
_erase(root, _value);
}
bool find(int _value) {
return _find(root, _value);
}
private:
inline void rotateLeft(Node *&node) {
Node *aux = node->left;
node->left = aux->right;
aux->right = node;
node = aux;
}
inline void rotateRight(Node *&node) {
Node *aux = node->right;
node->right = aux->left;
aux->left = node;
node = aux;
}
inline void balance(Node *&node) {
if(node->left->priority > node->priority)
rotateLeft(node);
if(node->right->priority > node->priority)
rotateRight(node);
}
void _insert(Node *&node, int value, int priority) {
if(node == nil) {
node = new Node(nil, nil, value, priority);
return;
}
if(value < node->value)
_insert(node->left, value, priority);
else _insert(node->right, value, priority);
balance(node);
}
bool _find(Node *&node, int value) {
if(node == nil)
return false;
if(node->value == value)
return true;
if(node->value > value)
return _find(node->left, value);
return _find(node->right, value);
}
void _erase(Node *&node, int value) {
if(node == nil)
return ;
if(node->value == value) {
if(node->left == nil && node->right == nil) {
delete(node);
node = nil;
}
else if(node->left->priority > node->right->priority) {
rotateLeft(node);
_erase(node->right, value);
}
else {
rotateRight(node);
_erase(node->left, value);
}
}
else if(node->value > value)
_erase(node->left, value);
else _erase(node->right, value);
}
};
Treap T;
int main() {
ifstream fin("hashuri.in");
ofstream fout("hashuri.out");
int M;
fin >> M;
while(M --) {
int op, x;
fin >> op >> x;
if(op == 1)
T.insert(x);
else if(op == 2)
T.erase(x);
else fout << T.find(x) << '\n';
}
}