Cod sursa(job #1338432)

Utilizator rughibemBelcineanu Alexandru Ioan rughibem Data 10 februarie 2015 00:32:00
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.83 kb
#include<stdio.h>
#define MAXN 200005
FILE *f=fopen("heapuri.in","r"), *g=fopen("heapuri.out","w");

long int N, tip, x, LHeap=0, Heap[MAXN], LPoz=0, Poz[MAXN], v[MAXN];

    // Poz[i] = pozitia celui de-al i-lea venit
    // v[i] = al catelea a venit nodul de pe pozitia i in heap

void Schimba( long int &x, long int &y ){long int t=x;x=y;y=t;}
long int Minim( long int A, long int B ){if(A<B)return A;return B;}

void Insereaza( long int nr ){
long int el;

    Heap[++LHeap] = nr; el = LHeap; Poz[++LPoz] = LHeap; v[LHeap]=LPoz;

    while( el/2 >= 1 && Heap[el/2] > Heap[el] ){
        Schimba( Heap[el], Heap[el/2] );
        Schimba( v[el], v[el/2] );
        Schimba( Poz[v[el]], Poz[v[el/2]] );
        el/=2;
    }

}

void Elimina( long int al ){
long int el = Poz[al], tata;

    Schimba( Poz[al], Poz[v[LHeap]] );
    Schimba( v[el], v[LHeap] );
    Schimba( Heap[ el ], Heap[ LHeap ]); LHeap--;


    while( el*2 <= LHeap && Minim(Heap[el*2],Heap[el*2+1]) < Heap[el] ){

        tata = el*2;
        if( el*2+1 <= LHeap && Heap[el*2+1] < Heap[el*2] ) tata = el*2+1;

        Schimba( Heap[el], Heap[tata] );
        Schimba( v[el], v[tata] );
        Schimba( Poz[v[el]], Poz[v[tata]] );
        el=tata;
    }

}

int main(){

    fscanf(f,"%ld",&N);

    while( N >= 1 ){ N--;

        fscanf(f,"%ld",&tip);
        if( tip == 1 || tip == 2 ) fscanf(f,"%ld",&x);

        if( tip == 1 ) Insereaza(x);
        if( tip == 2 ) Elimina(x);
        if( tip == 3 ) fprintf(g,"%ld\n",Heap[1]);

        //fprintf(g,"(%ld >> %ld) ",tip,x);
            //if(tip==2)fprintf(g," [[%ld]] ",Heap[Poz[x]]);
            //for(long int i=1;i<=LHeap;i++)fprintf(g,"%ld ",Heap[i]);fprintf(g," | ");
            //for(long int i=1;i<=LPoz;i++)fprintf(g,"%ld ",Poz[i]);fprintf(g,"\n");
    }

return 0;
}