Cod sursa(job #1513351)

Utilizator ZeBuGgErCasapu Andreas ZeBuGgEr Data 29 octombrie 2015 13:24:30
Problema Heapuri Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.73 kb
#include<stdio.h>
#include<algorithm>

using namespace std;

FILE *fin,*fout;
int n,t,nr,lph,val[200002],h[200002],pos[200002];

void setup(int nod)
{
    while(nod!=1)
    {
        if(val[h[nod]]<val[h[nod/2]])
        {
            swap(h[nod],h[nod/2]);
            swap(pos[h[nod]],pos[h[nod/2]]);
        }
        else break;
    }
}

void setdown(int nod)
{
    if(nod*2<=lph)
    {
        if(val[h[nod*2]]>val[h[nod*2+1]])
        {
            if(val[h[nod]]>val[h[nod*2+1]]&&(nod*2+1)<=lph)
            {
                swap(h[nod],h[nod*2+1]);
                swap(pos[h[nod]],pos[h[nod*2+1]]);
                setdown(nod*2+1);
            }
            else
            {
                swap(h[nod],h[nod*2]);
                swap(pos[h[nod]],pos[h[nod*2]]);
                setdown(nod*2);
            }
        }
        else
        {
            if(val[h[nod]]>val[h[nod*2]])
            {
                swap(h[nod],h[nod*2]);
                swap(pos[h[nod]],pos[h[nod*2]]);
                setdown(nod*2);
            }
        }
    }
}

int main()
{
    fin=fopen("heapuri.in","r");
    fout=fopen("heapuri.out","w");

    fscanf(fin,"%d",&n);

    for(int i=1;i<=n;i++)
    {
        fscanf(fin,"%d",&t);

        if(t==1)
        {
            nr++;
            fscanf(fin,"%d",&val[nr]);
            lph++;
            h[lph]=nr;
            pos[nr]=lph;
            setup(lph);
        }
        else if(t==2)
        {
            fscanf(fin,"%d",&t);
            h[pos[t]]=h[lph];
            pos[h[lph]]=pos[t];
            lph--;
            setdown(pos[t]);
        }
        else
        {
            fprintf(fout,"%d\n",val[h[1]]);
        }
    }
}