Cod sursa(job #819550)

Utilizator IoannaPandele Ioana Ioanna Data 19 noiembrie 2012 11:34:11
Problema Heapuri Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.76 kb
#include<fstream>
#define NMAX 200002
using namespace std;

int n;
int h[NMAX];
int vh[NMAX],hv[NMAX];
ifstream in("grader_test1.in");
ofstream out("heapuri.out");

void addToHeap(int k)
{
    int aux;
    if (k/2==0)
        return;
    if (h[k/2]>h[k])
    {
        aux=h[k/2];
        h[k/2]=h[k];
        h[k]=aux;

        vh[hv[k]]=k/2;
        vh[hv[k/2]]=k;
       /* aux=vh[hv[k]];
        vh[hv[k]]=vh[hv[k/2]];
        vh[hv[k/2]= aux;*/

        aux=hv[k];
        hv[k]=hv[k/2];
        hv[k/2]=aux;
        addToHeap(k/2);
    }
}

void down(int k)
{
    int aux;
    int fs,fd;
    fs=k<<1;
    fd=(k<<1)+1;
    if (fd<=h[0])
    {
        if (h[fd]<h[fs])
        {
            aux=h[fd];
            h[fd]=h[k];
            h[k]=aux;

            vh[hv[k]]=fd;
            vh[hv[fd]]=k;

            aux=hv[k];
            hv[k]=hv[fd];
            hv[fd]=aux;
            down(fd);
            return;
        }
    }
    if (fs<=h[0])
    {
        aux=h[fs];
        h[fs]=h[k];
        h[k]=aux;

        vh[hv[k]]=fs;
        vh[hv[fs]]=k;

        aux=hv[k];
        hv[k]=hv[fs];
        hv[fs]=aux;
        down(fs);
        return;
    }
}

void eraseFromHeap(int k)
{
    h[k]=h[h[0]];
    vh[hv[h[0]]]=k;
    hv[k]=hv[h[0]];
    h[0]--;
    down(k);

}

void operatii()
{
    int op,x;
    h[0]=0;
    in>>n;
    for (int i=1;i<=n;i++)
    {
        in>>op;
        switch(op)
        {
            case 1:{in>>x;h[++h[0]]=x;vh[++vh[0]]=h[0];hv[h[0]]=vh[0];addToHeap(h[0]);break;}
            case 2:{in>>x;
                    eraseFromHeap(vh[x]);break;}
            case 3:{out<<h[1]<<"\n";break;}

        }
    }
}

int main()
{
    operatii();
    return 0;
}