Cod sursa(job #1325459)

Utilizator blue_skyPetrica Stefan Cosmin blue_sky Data 23 ianuarie 2015 22:31:40
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.85 kb
#include <fstream>
#define DIM 200001

using namespace std;

int n,c,x,H[DIM],hp,poz[DIM],cr,nr[DIM];
// poz[i] = pozitia in heap a elem cu nr de ordine i
// nr[i] = nr de ordine al elem. de pe pozitia i in heap
// H[i] = valoarea elementului de pe pozitia i in heap

void addHeap(int k)
{
    //k = valoarea elementului
    ++hp;
    ++cr;
    int q=hp;
    while(k< H[q/2])
    {
        H[q]=H[q/2];
        nr[q]=nr[q/2];
        poz[nr[q]]=q;
        q/=2;
    }
    H[q]=k;
    nr[q]=cr;
    poz[cr]=q;
}
void delHeap(int k)
{
    // k = nr de ordine
    int p=poz[k]; //pozitia elementului cu nr de ordine k
    H[p]=H[hp];
    nr[p]=nr[hp];
    poz[nr[p]]=p;
    while(H[p] < H[p/2] && p>1)
    {
        swap(H[p],H[p/2]);
        swap(nr[p],nr[p/2]);
        swap(poz[nr[p]],poz[nr[p/2]]);
        p/=2;
    }
    while((H[p] > H[p*2] || H[p] > H[p*2+1] ) && 2*p<=hp)
    {
        if((H[p*2] < H[p*2 +1] && 2*p<=hp) || p*2+1> hp)
        {
            swap(H[p],H[p*2]);
            swap(nr[p],nr[p*2]);
            swap(poz[nr[p]],poz[nr[p*2]]);
            p*=2;
        }
        else if(2*p+1<=hp)
        {
            swap(H[p],H[p*2+1]);
            swap(nr[p],nr[p*2+1]);
            swap(poz[nr[p]],poz[nr[p*2+1]]);
            p=p*2+1;
        }
    }
}

int main()
{
    FILE *f=fopen("heapuri.in","r");
    FILE *g=fopen("heapuri.out","w");
    fscanf(f,"%d",&n);
    for(int i=1;i<=n;++i)
    {
        fscanf(f,"%d",&c);
        if(c==1)
        {
            fscanf(f,"%d",&x);
            // x- elementul nou
            addHeap(x);
        }
        else if(c==2)
        {
            fscanf(f,"%d",&x);
            // x- pozitia in vectorul v
            delHeap(x);
        }
        else
        fprintf(g,"%d\n", H[1]);
    }
    fclose(f);
    fclose(g);
    return 0;
}