Cod sursa(job #1487933)

Utilizator tanduraDomnita Dan tandura Data 17 septembrie 2015 17:31:17
Problema Heapuri Scor 10
Compilator c Status done
Runda Arhiva educationala Marime 1.81 kb
#include <stdio.h>
#include <stdlib.h>

int heap[200001];
int info[200001];
int poz[200001];
int n; //numarul operatiilor
int size=0; //dimensiune Heap
int x; //semnificatie enunt
int tip;

void swap (int a,int b)
{
    int t=heap[a];
    heap[a]=heap[b];
    heap[b]=t;
}

void percolate (int k)
{
    int tata = k >> 1; //k/2
    while (tata && info[heap[tata]]>info[heap[k]])
    {
        poz[heap[tata]]=k;
        poz[heap[k]]=tata;

        swap(k,tata);
        k=tata;
        tata= k >> 1;
    }
}

void sift (int k)
{
    int fiu;
    swap (size,k);
    size--;
    poz[heap[k]]=k;
    while(k<=size)
    {
        if (k*2<=size)
            {
                fiu=k*2;
                if (fiu+1<=size && info[heap[fiu+1]]<info[heap[fiu]])
                    fiu++;
            }
        else return;

        if (info[heap[k]]>info[heap[fiu]])
        {
            poz[heap[fiu]]=k;
            poz[heap[k]]=fiu;

            swap(fiu,k);
            k=fiu;
        }
    }
}

int main()
{
    int i;
    int k=0;
    FILE *f=fopen("heapuri.in","r");
    FILE *g=fopen("heapuri.out","w");
    fscanf(f,"%d",&n);
    for (i=1;i<=n;i++)
    {
        fscanf(f,"%d",&tip);
        switch(tip)
        {
            case 1:
            {
                fscanf(f,"%d",&x);
                info[++k]=x;
                heap[++size]=k;
                poz[k]=size;
                percolate(size);
                break;
            }
            case 2:
            {
                fscanf(f,"%d",&x);
                sift(poz[x]);
                break;
            }
            case 3:
            {
                fprintf(g,"%d\n",info[heap[1]]);
                break;
            }
        }
    }
    fclose(f);
    fclose(g);
    return 0;
}