Cod sursa(job #1082139)

Utilizator denisx304Visan Denis denisx304 Data 14 ianuarie 2014 11:07:06
Problema Heapuri Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.85 kb
#include <cstdio>
#include <algorithm>
using namespace std;
int my_heap[200000],poz_heap[200000],ordine[200000],n,nr,tip,x;
FILE *f,*g;
void schimba(int i, int j)
{
            swap(poz_heap[i],my_heap[j]);
            ordine[poz_heap[i]]=i;
            ordine[poz_heap[j]]=j;
            swap(my_heap[i],my_heap[j]);
}
void urca(int i)
{
    if ((i/2)>=1)
        if (my_heap[i/2]>my_heap[i])
        {
            schimba(i/2,i);
            urca(i/2);
        }
}
void coboara(int i)
{
    int minim;
    if ((2*i+1)<=n)
    {
        if (my_heap[2*i]<my_heap[i])
        {
            minim=my_heap[2*i];
            if (my_heap[2*i+1]<minim)
            {
                schimba(2*i+1,i);
                coboara(2*i+1);
            }
            else
            {
                schimba(2*i,i);
                coboara(2*i);
            }
        }
    }
    else
        if ((2*i)<=n)
            if (my_heap[2*i]<my_heap[i])
        {
            schimba(2*i,i);
            coboara(2*i);
        }
}
void inserare(int x)
{
    my_heap[++n]=x;
    poz_heap[n]=++nr;
    ordine[nr]=n;
    urca(n);
}
void stergere(int x)
{
    my_heap[x]=-1;
    urca(ordine[x]);
    ordine[poz_heap[1]]=0;
    poz_heap[1]=poz_heap[n--];
    ordine[poz_heap[1]]=1;
    if (n>1) coboara(1);
}
void afisare()
{
    fprintf(g,"%d\n",my_heap[1]);
}
int main()
{
    f=fopen("heapuri.in","r");
    g=fopen("heapuri.out","w");
    fscanf(f,"%d",&n);
    for (int i=1; i<=n; i++)
    {
        fscanf(f,"%d",&tip);
        //printf("%d\n",tip);
        if (tip==1) {
                fscanf(f,"%d",&x);
                inserare(x);}
        if (tip==2) {
                fscanf(f,"%d",&x);
                stergere(x);
                }
        if (tip==3) afisare();
    }
    fclose(f);
    fclose(g);
    return 0;
}