Cod sursa(job #1053089)

Utilizator alexsimi66FMI Simandi Alexandru alexsimi66 Data 12 decembrie 2013 10:44:22
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.04 kb
#include<iostream>
#include<fstream>
#define Nmax 200001

using namespace std;
int vec[Nmax],n,nr,ot[Nmax],nrcrt;
struct heap
{
    int val,crt; //crt pentru al catelea elemente inserat este
}h[Nmax];
void urca(int poz,int n)
{
    heap aj;
    int aj2;
    if(poz>1)
        if(h[poz].val<h[poz/2].val)
        {
            aj=h[poz];
            h[poz]=h[poz/2];
            h[poz/2]=aj;
            //interschimbare cu un heap aj auxiliar
            aj2=ot[h[poz].crt];
            ot[h[poz].crt]=ot[h[poz/2].crt];
            ot[h[poz/2].crt]=aj2;

            urca(poz/2,n);
        }
}

int minim(int poz,int n)        //minimul dintre fii
{
    if(2*poz+1<=n)
        if(h[2*poz].val<h[2*poz+1].val)
            return 2*poz;
        else
            return 2*poz+1;
    else
        return 2*poz;

}

void coboara(int poz,int n)
{
    int aj,aj2;
    heap z;
    if(2*poz<=n)
    {
        aj=minim(poz,n);
        if(h[aj].val<h[poz].val)
        {
            z=h[aj];
            h[aj]=h[poz];
            h[poz]=z;
            //interschimbare
            aj2=ot[h[aj].crt];
            ot[h[aj].crt]=ot[h[poz].crt];
            ot[h[poz].crt]=aj2;

            coboara(aj,n);
        }
    }
}

int main()
{
    int op,val;  //operatie , valoare (doar pt operatie 1 si 2)
    ifstream fin("heapuri.in");
    ofstream fout("heapuri.out");;
    fin>>n;;
    for(int i=1;i<=n;i++)
    {
        fin>>op;
        switch(op) //triaza operatia
        {
        case 1:{
                fin>>val;
                nr++;
                nrcrt++;
                h[nr].val=val;
                h[nr].crt=nrcrt;
                ot[nrcrt]=nr;
                urca(nr,nr);
                }break;
        case 2:{
                fin>>val;
                h[ot[val]]=h[nr];
                ot[h[nr].crt]=ot[val];
                nr--;
                coboara(ot[val],nr);
                }break;
        case 3: fout<<h[1].val<<"\n";
                break;
        }
    }
    return 0;
}