Pagini recente » Cod sursa (job #971613) | Istoria paginii runda/1234567/clasament | Cod sursa (job #452462) | Cod sursa (job #2297900) | Cod sursa (job #1193035)
#include <algorithm>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <ctime>
using namespace std;
struct TreapNode {
int key, pry;
TreapNode *left, *right;
TreapNode(){};
TreapNode(const int _key, const int _pry, TreapNode *_left, TreapNode *_right)
{
key = _key;
pry = _pry;
left = _left;
right = _right;
}
} *Root, *NIL;
void RotLeft(TreapNode* &node)
{
TreapNode *aux = node->left;
node->left = aux->right;
aux->right = node;
node = aux;
}
void RotRight(TreapNode* &node)
{
TreapNode *aux = node->right;
node->right = aux->left;
aux->left = node;
node = aux;
}
void Balance(TreapNode* &node)
{
if (node->left->pry > node->pry)
RotLeft(node);
else if(node->right->pry > node->pry)
RotRight(node);
}
int Find(TreapNode *node, const int key)
{
if (node == NIL) return 0;
if (key < node->key)
return Find(node->left, key);
if (key > node->key)
return Find(node->right, key);
return 1;
}
void Insert(TreapNode* &node, const int key, const int pry)
{
if (node == NIL)
{
node = new TreapNode(key, pry, NIL, NIL);
return;
}
if (key < node->key) Insert(node->left, key, pry);
else if (key > node->key) Insert(node->right, key, pry);
Balance(node);
}
void Erase(TreapNode* &node, const int key)
{
if (node == NIL) return;
if (key == node->key)
{
if (node->right == NIL && node->left == NIL)
{
delete node;
node = NIL;
return;
}
else if (node->left->pry > node->right->pry)
RotLeft(node);
else
RotRight(node);
Erase(node, key);
}
else if (key < node->key)
Erase(node->left, key);
else
Erase(node->right, key);
}
void Init()
{
srand(time(0));
Root = NIL = new TreapNode(0, 0, NULL, NULL);
}
int get_rand()
{
int ret = (rand() % 32013 * 10000) + rand() % 32013;
if (ret < 0) return -ret;
if (!ret) return 1;
return ret;
}
int main()
{
freopen("hashuri.in", "r", stdin);
freopen("hashuri.out", "w", stdout);
Init();
int Q;
scanf("%d", &Q);
while (Q--)
{
int op, x;
scanf("%d%d", &op, &x);
if (op == 1)
Insert(Root, x, get_rand());
else if (op == 2)
Erase(Root, x);
else if (op == 3)
printf("%d\n", Find(Root, x));
}
}