Cod sursa(job #1514511)

Utilizator Mihnea769Zarafu Mihnea Mihnea769 Data 31 octombrie 2015 11:48:52
Problema Heapuri Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.08 kb
#include<stdio.h>

FILE *in,*out;

int h[200001],v[200001],poz[200001],nh,nr,N;

void schimb(int p,int q)
{

    int aux=h[p];
    h[p]=h[q];
    h[q]=aux;
    poz[h[p]]=p;
    poz[h[q]]=q;
}

void coboara(int p)
{
    int bun=p,fs=2*p,fd=2*p+1;
    if(fs<=nh && v[h[fs]]<v[h[bun]])
        bun=fs;
    if(fd<=nh && v[h[fd]]<v[h[bun]])
        bun=fd;
    if(bun!=p)
    {
        schimb(bun,p);
        coboara(bun);
    }
}

void urca(int p)
{
    while(p>1 && h[p]<h[p/2])
    {
        schimb(p,p/2);
        p/=2;
    }
}

int main()
{
    in=fopen("heapuri.in","r");
    out=fopen("heapuri.out","w");
    int i,tip,x,p;
    fscanf(in,"%d",&N);
    for(i=1; i<=N; i++)
    {
        fscanf(in,"%d",&tip);
        if(tip==1)
        {
            fscanf(in,"%d",&v[++nr]);
            h[++nh]=nr;
            poz[nr]=nh;
            urca(nh);
        }
        if(tip==2)
        {
            fscanf(in,"%d",&x);
            p=poz[x];
            schimb(p,nh--);
            urca(p);
            coboara(p);
        }
        if(tip==3)
            fprintf(out,"%d\n",v[h[1]]);
    }
    return 0;
}