Pagini recente » Cod sursa (job #1813280) | Cod sursa (job #2621654) | Cod sursa (job #831829) | Cod sursa (job #2720750) | Cod sursa (job #339155)
Cod sursa(job #339155)
#include <stdio.h>
#define MAXN 400002
int pos[MAXN];
int nri = 0;
struct nod
{
int key;
int timp;
};
class Heap
{
public:
int size;
nod h[MAXN];
Heap();
int getMin();
void deleteNode(int key);
void heapify(int key);
void insertElement(int key);
};
Heap::Heap()
{
size = 0;
}
void swap(nod &x,nod &y)
{
nod temp = x;
x = y;
y = temp;
}
void Heap::heapify(int key)
{
while ((h[key].key>h[2*key].key || h[key].key>h[2*key+1].key) && 2*key<=size)
{
if (2*key+1>size && h[2*key].key<h[key].key)
{
pos[h[key].timp] = 2*key;
pos[h[key*2].timp] = key;
swap(h[key],h[2*key]);
key = 2*key;
}
else if (2*key+1>size)
{
return;
}
else if (h[2*key].key<h[2*key+1].key)
{
pos[h[key].timp] = 2*key;
pos[h[key*2].timp] = key;
swap(h[key],h[2*key]);
key = 2*key;
}
else
{
pos[h[key].timp] = 2*key+1;
pos[h[key*2+1].timp] = key;
swap(h[key],h[2*key+1]);
key = 2*key + 1;
}
}
}
void Heap::insertElement(int key)
{
size++;
nri++;
h[size].key = key;
key = size;
h[size].timp = nri;
while (h[key/2].key > h[key].key && key>1)
{
pos[h[key].timp] = key/2;
pos[h[key/2].timp] = key;
swap(h[key/2],h[key]);
key/=2;
}
pos[nri] = key;
}
int Heap::getMin()
{
return h[1].key;
}
void Heap::deleteNode(int key)
{
h[pos[key]] = h[size];
size--;
heapify(pos[key]);
}
int main()
{
freopen("heapuri.in","r",stdin);
freopen("heapuri.out","w",stdout);
Heap a;
int i,n,key,op;
scanf("%d",&n);
for (i=0;i<n;i++)
{
scanf("%d",&op);
if (op!=3)
{
scanf("%d",&key);
}
switch (op)
{
case 1: a.insertElement(key);break;
case 2: a.deleteNode(key);break;
case 3: printf("%d\n",a.getMin());break;
}
}
return 0;
}