Cod sursa(job #1189577)

Utilizator victormarinMarin Victor victormarin Data 23 mai 2014 10:46:44
Problema Heapuri Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 1.94 kb
#include <cstdio>
#define filein "heapuri.in"
#define fileout "heapuri.out"
using namespace std;

struct elem
{
    int x;
    int poz;
};

FILE *out;

elem h[200001];  // heap
elem v[200001];  // intrare

int kh,kv;

void afisare();

void adaugare_heap(int);
void eliminare_heap(int);

int main()
{
    FILE *in;
    in=fopen(filein,"r");
    out=fopen(fileout,"w");
    int i,mod,x;
    int n;
    fscanf(in,"%d",&n);
    for (i=1; i<=n; i++)
    {
        fscanf(in,"%d",&mod);
        if (mod==3) afisare();
        else
        {
            fscanf(in,"%d",&x);
            if (mod==1) adaugare_heap(x);
            else eliminare_heap(x);
        }
    }
    fclose(in);
    fclose(out);
    return 0;
}

void afisare()
{
    fprintf(out,"%d\n",h[1].x);
}

void adaugare_heap(int x)
{
    kv++;
    v[kv].x=x;
    kh++;
    h[kh].x=x;
    h[kh].poz=kv;
    v[kv].poz=kh;
    int n=kh;
    elem aux;
    while (h[n].x<h[n/2].x && n>1)
    {
        aux=h[n];
        h[n]=h[n/2];
        h[n/2]=aux;
        v[h[n/2].poz].poz=n/2;
        v[h[n].poz].poz=n;
        n=n/2;
    }
}

void eliminare_heap(int x)
{
    elem aux;
    int p;
    p=v[x].poz;
    v[x].poz=-1;
    h[p]=h[kh];
    kh--;
    v[h[p].poz].poz=p;
    int n=p;
    int ind;
    while (h[n].x<h[n/2].x && n>1)
    {
        aux=h[n];
        h[n]=h[n/2];
        h[n/2]=aux;
        v[h[n/2].poz].poz=n/2;
        v[h[n].poz].poz=n;
        n=n/2;
    }
    while (n<kh/2 && (h[n].x>h[n*2].x || h[n].x>h[n*2+1].x))
    {
        if (h[2*n].x < h[2*n+1].x)
            ind=2*n;
        else ind=2*n+1;
        aux=h[n];
        h[n]=h[ind];
        h[ind]=aux;
        v[h[ind].poz].poz=ind;
        v[h[n].poz].poz=n;
        n=ind;
    }
    if (2*n==kh && h[n].x>h[2*n].x)
    {
        aux=h[n];
        h[n]=h[kh];
        h[kh]=aux;
        v[h[kh].poz].poz=kh;
        v[h[n].poz].poz=n;
    }
}