Cod sursa(job #1189503)

Utilizator AndreiOprisanFMI - Oprisan Andrei Daniel AndreiOprisan Data 22 mai 2014 23:50:18
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.49 kb
#include<iostream>
#include<stdio.h>
#define MAX 200008
using namespace std;
int Heap[MAX],Pos[MAX],Ord[MAX],n,nrord;

void push(int x)
{
    n++;
    int poz=n;
    Heap[poz]=x;
    nrord++;
    Pos[nrord]=poz;
    Ord[n]=nrord;
    while(poz/2>0 && Heap[poz]<Heap[poz/2])
    {
        swap(Heap[poz],Heap[poz/2]);
        swap(Pos[Ord[poz]],Pos[Ord[poz/2]]);
        swap(Ord[poz],Ord[poz/2]);
        poz=poz/2;
    }
    
}
void pop(int x)
{
    int i,poz,fiu;
    poz=Pos[x];
    Heap[poz]=Heap[n];
    n--;
    do
    {
        fiu=0;
        if(2*poz<=n && Heap[2*poz]<Heap[poz]) 
            fiu=2*poz;
        if(2*poz+1<=n && Heap[2*poz+1]<Heap[2*poz])
            fiu=2*poz+1;
        if(Heap[fiu]>=Heap[poz])
            fiu=0;
        if(fiu)
        {
            swap(Heap[fiu],Heap[poz]);
            swap(Pos[Ord[fiu]],Pos[Ord[poz]]);
            swap(Ord[fiu],Ord[poz]);
            poz=fiu;
        }
    }while(fiu);
}
int main()
{
     FILE *f,*g;
     int nrop,i,op,tp;
     f=fopen("heapuri.in","r");
     g=fopen("heapuri.out","w");
     fscanf(f,"%d",&nrop);
     for(i=0;i<nrop;i++)
     {
         fscanf(f,"%d",&op);
         if(op==1)
         {
             fscanf(f,"%d",&tp);
             push(tp);
         }
         if(op==2)
         {
             fscanf(f,"%d",&tp);
             pop(tp);
         }
         if(op==3)
            fprintf(g,"%d\n",Heap[1]);
     }
     fclose(f);
     fclose(g);
     return 0;
}