Cod sursa(job #790468)

Utilizator ioana.teocIoana Teoc ioana.teoc Data 21 septembrie 2012 15:45:52
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.6 kb
#include <iostream>
#include <fstream>

using namespace std;

ifstream f("heapuri.in");
ofstream g("heapuri.out");

#define nmax 200005

int n, V[nmax], Heap[nmax], Poz[nmax], cnt_H;
void citeste(){
    f >> n;
}
void in_sus(int Nod){
    if (Nod == 1) return;
    if ( V[ Heap[Nod] ] < V[ Heap[Nod/2] ] ){
        swap(Poz[ Heap[Nod] ], Poz[ Heap[Nod/2] ]);
        swap(Heap[Nod], Heap[Nod/2]);
        in_sus(Nod/2);
    }
}
void in_jos(int Nod){

    int Fiu_min = Nod;
    int St = Nod*2; 
    int Dr = Nod*2+1;
    
    if ( St <= cnt_H && V[ Heap[St] ] < V[ Heap[Fiu_min] ] ) Fiu_min = St;
    if ( Dr <= cnt_H && V[ Heap[Dr] ] < V[ Heap[Fiu_min] ] ) Fiu_min = Dr;
    if (Fiu_min == Nod) return; 
    swap( Poz[ Heap[Nod] ], Poz[ Heap[Fiu_min] ] );
    swap( Heap[Nod], Heap[Fiu_min] );
    in_jos(Fiu_min);
}
void adauga(int X){
    ++cnt_H;
    ++V[0];
    V[ V[0] ] = X;
    Poz[ V[0] ] = cnt_H;
    Heap[cnt_H] = V[0];
    in_sus(cnt_H);
}
void sterge(int X){
    
    int poz_H = Poz[X];
    Poz[ Heap[cnt_H] ] = Poz[ Heap[ poz_H ] ];
    Heap[ poz_H ] = Heap[ cnt_H ];
    --cnt_H;
   
    int Nod = Poz[ Heap[ poz_H ] ];
    if (Nod > 1 && V[ Heap[Nod] ] < V[ Heap[Nod/2] ]){
        in_sus(Nod);
    }else in_jos(Nod);
    
}

void rezolva(){
    
    for(int i=1; i<=n; ++i){
        int tip, X;
        f >> tip;
        if (tip == 1){
            f >> X;
            adauga(X);
        }else if (tip == 2){
            f >> X;
            sterge(X);
        }else{
            g << V[ Heap[1] ] << "\n";
            
        }
    }
}

int main(){
    citeste();
    rezolva();
    f.close();
    g.close();
    return 0;
}