Cod sursa(job #601570)

Utilizator acelasi7Tudor Maxim acelasi7 Data 7 iulie 2011 00:24:07
Problema Heapuri Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.86 kb
#include<fstream>
#include<iostream>
#include<cstdio>
using namespace std;

FILE *in=fopen("heapuri.in","r");
FILE *out=fopen("heapuri.out","w");

int ord[10000],poz_ord[10000],nr;
int H[10000],nrh;
//poz_ord indica sprea heap
//ord indica spre poz_ord dinspre heap
void adaugare_element(int val)
{
    int poz,aux;
    poz=++nrh;
    ord[poz]=++nr;
    poz_ord[nr]=poz;
    H[poz]=val;
    while(H[poz/2]>val && poz/2>0)
    {
        aux=H[poz];
        H[poz]=H[poz/2];
        H[poz/2]=aux;
        poz_ord[ord[poz]]=poz/2;
        poz_ord[ord[poz/2]]=poz;
        aux=ord[poz];
        ord[poz]=ord[poz/2];
        ord[poz/2]=aux;
        poz/=2;
    }
    //H[poz]=val;
    //poz_ord[++nr]=poz;
    //ord[poz]=nr;
}
void stergere_element(int poz)
{
    int aux,f1,f2,son;
    H[poz]=H[nrh];
    poz_ord[ord[nrh]]=poz;
    ord[poz]=ord[nrh--];
    do{
        f1=poz*2;
        son=poz;
        if(f1<=nrh && H[f1]<H[son])
        {
            son=f1;
            f2=f1+1;
            if(f2<=nrh && H[f2]<H[son])
                son=f2;
        }
        else son=0;
        if(son)
        {
            aux=H[son];
            H[son]=H[poz];
            H[poz]=aux;
            aux=ord[son];
            ord[son]=ord[poz];
            ord[poz]=aux;
            aux=poz_ord[ord[poz]];
            poz_ord[ord[poz]]=poz_ord[ord[son]];
            poz_ord[ord[son]]=aux;
        }

    }while(son);
}
int main()
{
    int n,k,o,x;
    fscanf(in,"%d",&n);
    for(k=1;k<=n;++k)
    {
        fscanf(in,"%d",&o);
        switch(o)
        {
            case(1):
                fscanf(in,"%d",&x);
                adaugare_element(x);
                break;
            case(2):
                fscanf(in,"%d",&x);
                stergere_element(poz_ord[x]);
                break;
            case(3):fprintf(out,"%d\n",H[1]);
                break;
        }
    }
    //cout<<n;
    return 0;
}