Pagini recente » Cod sursa (job #1712251) | Cod sursa (job #2430508) | Cod sursa (job #2961014) | Cod sursa (job #798274) | Cod sursa (job #268613)
Cod sursa(job #268613)
#include <cstdio>
#include <cstdlib>
#define Nmax 200001
class MinHeap
{
struct nod { int val, ord; } ;
private : int nrH, *poz, nr;
private : nod *h;
private : void swap(int x, int y) { int temp = poz[h[x].ord]; poz[h[x].ord] = poz[h[y].ord]; poz[h[y].ord] = temp; nod tmp = h[x]; h[x] = h[y]; h[y] = tmp; }
private : void heapUp(int loc)
{
if (loc == 1) return;
int tata = loc >> 1;
if (h[loc].val < h[tata].val) { swap(loc,tata); heapUp(tata); }
}
private : void heapDown(int loc)
{
int fiu = loc << 1;
if (fiu > nrH) return;
if (fiu + 1 <=nrH && h[fiu + 1].val < h[fiu].val) ++fiu;
if (h[loc].val > h[fiu].val) { swap(loc,fiu); heapDown(fiu); }
}
public : MinHeap(int size)
{
poz = (int *)calloc(size, sizeof(int));
h = (nod *)calloc(size, sizeof(nod));
nr = nrH = 0;
}
public : int Min()
{
return h[1].val;
}
public : void Push(int x)
{
poz[++nr] = ++nrH;
h[nrH].val = x; h[nrH].ord = nr;
heapUp(nrH);
}
public : void Pop(int loc)
{
loc = poz[loc];
swap(loc,nrH--);
heapDown(loc);
}
} ;
int N, a, b;
MinHeap heap(Nmax);
int main()
{
freopen("heapuri.in", "r", stdin);
freopen("heapuri.out", "w", stdout);
for ( scanf("%d\n", &N); N; --N)
{
scanf ("%d ", &a);
if (a < 3) scanf("%d\n", &b);
switch(a)
{
case 1 : heap.Push(b); break;
case 2 : heap.Pop(b); break;
case 3 : printf("%d\n", heap.Min());
}
}
return 0;
}