Cod sursa(job #1486676)

Utilizator andreeacozma95Cozma Andreea andreeacozma95 Data 15 septembrie 2015 12:50:38
Problema Heapuri Scor 0
Compilator c Status done
Runda Arhiva educationala Marime 2.7 kb
#include <stdio.h>
#include <stdlib.h>

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

int parinte (int v) //v - pozitie
{
    return v/2;
}

int fiu_stang(int v)
{
    return v*2;
}

int fiu_drept(int v)
{
    return v*2+1;
}

void sift (int v)
{
    int son=0;
    do
    {
        son=0;
        if (fiu_stang(v)<=size)
        {
            son=fiu_stang(v);
            if (fiu_drept(v)<=size && cronologic[Heap[fiu_drept(v)]]>cronologic[Heap[son]])
                son=fiu_drept(v);
        }
        if (son!=0 && cronologic[Heap[v]]>cronologic[Heap[son]])
        {
            int aux = Heap[v]; // interschimbare in Heap a pozitiilor din cronologic a numerelor
            Heap[v]=Heap[son];
            Heap[son]=aux;

            aux = poz[Heap[v]]; // interschimbare a pozitiilor catre locurile din Heap
            poz[Heap[v]]=poz[Heap[son]];
            poz[Heap[son]]=aux;
            v=son;
        }
    }while(son);
}

void percolate (int v)
{
    int parintele;
    parintele = parinte(v);
    if (parintele>=1 && cronologic[Heap[parintele]]>cronologic[Heap[v]]) // daca parintele = 0 e pe radacina
         {
            int aux=Heap[v];
            Heap[v]=Heap[parintele];
            Heap[parintele]=aux;

            aux = poz[Heap[v]];
            poz[Heap[v]]=poz[Heap[parintele]];
            poz[Heap[parintele]]=aux;

            percolate(parintele);
        }
}

void add (int val,int index)
{
    Heap[++size]=index;
    cronologic[index]=val;
    poz[index]=size;
    percolate(size);
}

void cut (int v)
{
    if (poz[v]==size)
        size--;
    else
    {
        Heap[poz[v]]=Heap[size--];
        if (poz[v]>1 && cronologic[Heap[parinte(poz[v])]]>cronologic[Heap[poz[v]]])
            percolate(poz[v]);
        else
            sift(poz[v]);
    }
}

int main()
{
    int i;
    int indexCronologic=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);
                indexCronologic++;
                add(x,indexCronologic);
                break;
            }
            case 2:
            {
                fscanf(f,"%d",&x);
                cut (x);
                break;
            }
            case 3:
            {
                fprintf(g,"%d\n",cronologic[Heap[1]]);
                break;
            }
        }
    }
    fclose(f);
    fclose(g);
    return 0;
}