Cod sursa(job #1240269)

Utilizator danyro364Savu Ioan Daniel danyro364 Data 10 octombrie 2014 22:17:45
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.57 kb
#include <stdio.h>
#define nmax 200001
using namespace std;
long heap[nmax],v[nmax],poz[nmax],n,k;
void swaps(int p1, int p2)
{
    long aux;
    poz[heap[p1]]=p2;
    poz[heap[p2]]=p1;
    aux=heap[p1];
    heap[p1]=heap[p2];
    heap[p2]=aux;
}
void urca(int p)
{
    while(p/2>0&&v[heap[p/2]]>v[heap[p]])
    {
        swaps(p,p/2);
        p=p/2;
    }
}
void coboara(int p)
{
    int ok,poz; long mini;
    do{
        ok=0;mini=932123321;
        if(p*2<=n&&v[heap[p*2]]<mini)
        {
            poz=p*2; mini=v[heap[poz]];
        }
        if(p*2+1<=n&&v[heap[p*2+1]]<mini)
        {
            poz=p*2+1; mini=v[heap[poz]];
        }
        if(mini!=932123321&&mini<v[heap[p]])
        {
            ok=1;
            swaps(p,poz);
            p=poz;
        }

    }while(ok);
}
int main()
{
    FILE *f=fopen("heapuri.in","r"),*g=fopen("heapuri.out","w");
    unsigned long i,j,x;
    int cod;
    fscanf(f,"%ld",&j);
    for(i=1;i<=j;i++)
    {
        fscanf(f,"%d",&cod);
        if(cod==3)
            fprintf(g,"%d\n",v[heap[1]]);
        else {
            fscanf(f,"%ld",&x);
            if(cod==1)
            {
                ++k;
                heap[++n]=k;
                poz[k]=n;
                v[k]=x;
                urca(poz[k]);
            }
            else {
                heap[poz[x]]=heap[n];
                poz[heap[n]]=poz[x];
                --n;
                if(poz[x]<n)
                    coboara(poz[x]);
            }
        }
    }
    fclose(f); fclose(g);
    return 0;
}