Cod sursa(job #1487937)

Utilizator andreeacozma95Cozma Andreea andreeacozma95 Data 17 septembrie 2015 17:38:12
Problema Heapuri Scor 10
Compilator c Status done
Runda Arhiva educationala Marime 1.88 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 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;

        int t=heap[k];
        heap[k]=heap[tata];
        heap[tata]=t;

        k=tata;
        tata= k >> 1;
    }
}

void sift (int k)
{
    int fiu;

    int t=heap[k];
    heap[k]=heap[size];
    heap[size]=t;

    size--;
    poz[heap[k]]=k;
    while(k<=size)
    {
        if (k*2<=size)
            {
                fiu=k<<1;
                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;

            t=heap[k];
            heap[k]=heap[fiu];
            heap[fiu]=t;

            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;
}