Cod sursa(job #1069887)

Utilizator Daniel3717Aleca Daniel Adrian Daniel3717 Data 30 decembrie 2013 17:06:19
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.49 kb
#include <iostream>
#include <fstream>
using namespace std;
#define MAX 2000000000
ifstream f("heapuri.in");
ofstream g("heapuri.out");
struct ab
{
    int val,ord;
} heap[400005];
int d[400005],n,i,nr,io,inr,dio,nheap,k1;
void heapswap(int p1,int p2)
{
    int o1,o2;
    o1=heap[p1].ord;
    o2=heap[p2].ord;
    int iax;
    iax=d[o1];
    d[o1]=d[o2];
    d[o2]=iax;
    ab ax;
    ax=heap[p1];
    heap[p1]=heap[p2];
    heap[p2]=ax;
}
void heapup(int o)
{
    if (o==1)
        return;
    if (heap[o].val<heap[o/2].val)
    {
        heapswap(o,o/2);
        heapup(o/2);
    }
}
void heapdown(int o)
{
    int om;
    if (heap[o*2].val<heap[o*2+1].val)
        om=o*2;
    else
        om=o*2+1;
    if (heap[o].val>heap[om].val)
    {
        heapswap(o,om);
        heapdown(om);
    }
}
int main(void)
{
    f>>n;
    for (i=1;i<=400004;i++)
        heap[i].val=MAX;
    for (i=1;i<=n;i++)
    {
        f>>nr;
        if (nr==3)
            g<<heap[1].val<<'\n';
        if (nr==2)
        {
            f>>io;
            dio=d[io];
            heapswap(dio,nheap);
            heap[nheap].val=MAX;
            heap[nheap].ord=0;
            nheap--;
            heapup(dio);
            heapdown(dio);
        }
        if (nr==1)
        {
            k1++;
            f>>inr;
            nheap++;
            d[k1]=nheap;
            heap[nheap].val=inr;
            heap[nheap].ord=k1;
            heapup(nheap);
        }
    }
}