Cod sursa(job #1028043)

Utilizator lehman97Dimulescu David lehman97 Data 13 noiembrie 2013 16:36:37
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.5 kb
#include <iostream>
#include <stdio.h>

using namespace std;

FILE *f=fopen("heapuri.in","r");
FILE *g=fopen("heapuri.out","w");

int k,nr,i,v[200001],n,w[200001],poz,q[200001];

void combheap(int i,int n);
void up(int fiu);
int extrage();

int main()
{
    fscanf(f,"%d",&n);
    k=0;
    for(i=1;i<=n;i++)
    {
        fscanf(f,"%d",&nr);
         if(nr==1)
         {
             fscanf(f,"%d",&v[++k]);
             w[k]=k;
             q[k]=k;
             up(w[k]);
        }
        if(nr==3) fprintf(g,"%d\n",v[1]);
        if(nr==2)
        {
            fscanf(f,"%d",&poz);
            v[q[poz]]=1000000001;
            combheap(q[poz],k);
        }
    }
    fclose(g);
    return 0;
}
void combheap(int i,int n)
{
    int a=v[i],tata=i,fiu=2*i;
    while(fiu<=n)
    {
        if(fiu<n)
        if(v[fiu]>v[fiu+1])fiu++;
        if(a>v[fiu])
        {
            swap(v[fiu],v[tata]);
            swap(w[tata],w[fiu]);
           q[w[tata]]=tata;
            q[w[fiu]]=fiu;
            tata=fiu;
            fiu=2*fiu;
        } else fiu=n+1;
    }
    v[tata]=a;
}
void up(int fiu)
{
   int a=v[fiu],tata=fiu/2;
    while (tata>=1)
    {
        if(v[tata]>v[fiu])
        {
            swap(v[fiu],v[tata]);
            swap(w[tata],w[fiu]);
            q[w[tata]]=tata;
            q[w[fiu]]=fiu;
           // q[w[fiu]]=w[fiu];
            //q[w[tata]]=w[tata];
            fiu=tata;
            tata=fiu/2;
        } else tata=0;
    }
}