Pagini recente » Cod sursa (job #62072) | Cod sursa (job #1570661) | Cod sursa (job #906973) | Cod sursa (job #347836) | Cod sursa (job #1071831)
#include <cstdio>
#include <ctime>
#include <cstdlib>
#include <algorithm>
using namespace std;
struct item {
int key, priority;
item *left, *right;
item() { };
item(int key, int priority, item *left, item *right) {
this -> key = key;
this -> priority = priority;
this -> left = left, this -> right = right;
}
};
typedef item * pitem;
pitem R, nil;
void init()
{
srand(time(0));
R = nil = new item(0, 0, NULL, NULL);
}
int search(pitem n, int key)
{
if (n == nil)
return 0;
if (key == n -> key)
return 1;
if (key <= n -> key)
return search(n -> left, key);
return search(n -> right, key);
}
void rotleft(pitem &n)
{
pitem t = n -> left;
n -> left = t -> right;
t -> right = n;
n = t;
}
void rotright(pitem &n)
{
pitem t = n -> right;
n -> right = t -> left;
t -> left = n;
n = t;
}
void balance(pitem &n)
{
if (n -> left -> priority > n -> priority)
rotleft(n);
else
if (n -> right -> priority > n -> priority)
rotright(n);
}
void insert(pitem &n, int key, int priority)
{
if (n == nil)
{
n = new item(key, priority, nil, nil);
return ;
}
if (key <= n -> key)
insert(n -> left, key, priority);
else
insert(n -> right, key, priority);
balance(n);
}
void erase(pitem &n, int key)
{
if (n == nil)
return ;
if (key < n -> key)
erase(n -> left, key);
else
if (key > n -> key)
erase(n -> right, key);
else
{
if (n -> left == nil && n -> right == nil)
{
delete n;
n = nil;
}
else
{
(n -> left -> priority > n -> right -> priority) ? rotleft(n) : rotright(n);
erase(n, key);
}
}
}
int getMin(pitem &n)
{
if (n -> left != nil)
return getMin(n -> left);
return n -> key;
}
#define NMAX 200005
int n, A[NMAX], r;
int main()
{
//~ freopen("input", "r", stdin);
freopen("heapuri.in", "r", stdin);
freopen("heapuri.out", "w", stdout);
init();
scanf("%d", &n);
int type, x;
while (n--)
{
scanf("%d", &type);
switch (type)
{
case 1: scanf("%d", &x);
insert(R, x, rand() + 1);
A[++r] = x;
break ;
case 2: scanf("%d", &x);
erase(R, A[x]);
break ;
case 3: printf("%d\n", getMin(R));
break ;
}
}
return 0;
}