Cod sursa(job #815545)

Utilizator alexpascadiAlexandru Pascadi alexpascadi Data 17 noiembrie 2012 10:30:37
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.19 kb
#include <stdio.h>

const int N=200001;
int v[N],h[N],poz[N],nr=0;

void schimb(int i, int j)
{
    int aux;
    aux=h[i];
    h[i]=h[j];
    h[j]=aux;

    poz[h[i]]=i;
    poz[h[j]]=j;
}

void urca(int i)
{
    if(i/2>0 && v[h[i]]<v[h[i/2]])
    {
        schimb(i,i/2);
        urca(i/2);
    }
}

void coboara(int i)
{
    int fs=2*i, fd=2*i+1, bun=i;
    if(fs<=nr && v[h[fs]]<v[h[bun]]) bun=fs;
    if(fd<=nr && v[h[fd]]<v[h[bun]]) bun=fd;

    if(bun!=i)
    {
        schimb(i,bun);
        coboara(bun);
    }
}

int main()
{
    FILE *in,*out;
    in=fopen("heapuri.in","r");
    out=fopen("heapuri.out","w");
    int i,n,x,y,p,nrv=0;

    fscanf(in,"%d",&n);
    for(i=1;i<=n;i++)
    {
        fscanf(in,"%d",&x);
        if(x==1)
        {
            fscanf(in,"%d",&y);
            v[++nrv]=y;
            h[++nr]=nrv;
            poz[nrv]=nr;
            urca(nr);
        }
        if(x==2)
        {
            fscanf(in,"%d",&y);
            p=poz[y];
            h[p] = h[nr--];
            poz[h[p]]=p;
            urca(p);
            coboara(p);
        }
        if(x==3)
            fprintf(out,"%d\n",v[h[1]]);
    }
}