Cod sursa(job #2442987)

Utilizator mirceaisherebina mircea mirceaishere Data 25 iulie 2019 23:27:00
Problema Heapuri Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.09 kb
#include <fstream>
#include <bitset>
using namespace std;
ifstream fin("heapuri.in");
ofstream fout("heapuri.out");

int n, NumereInHeap, operatii, t, val, heap[200005], v[200005];

/// fie i: tatal lui i este i/2
/// fie i: fiul stang al lui este i*2, iar cel drept i*2+1
/// in v tin valorile initiale, in ordinea lor
/// in heap tin valorile "sortate"
/// caut minimul, acesta este mereu in heap[1]

void VerificaTatii(int poz){
    int valoare=heap[poz];
    while(poz>1 && valoare<heap[poz/2]){
        heap[poz]=heap[poz/2];
        poz=poz/2;
    }
    heap[poz]=valoare;
}

int PozitiaInHeap(int valoare){
    for(int i=1; i<=NumereInHeap; i++){
        if(heap[i]==valoare){
            return i;
        }
    }
    return -1;
}

void VerificaFii(int poz){
    int ok=1;
    while(ok==1){
        ok=0;
        if(poz*2<=NumereInHeap  && heap[poz]>heap[poz*2] && (poz*2+1>NumereInHeap || heap[poz*2]<heap[poz*2+1]) ){
            /// Fiul din stanga
            ok=1;
            swap(heap[poz], heap[poz*2]);
            poz=poz*2;
        }else{
            if(poz*2+1<=NumereInHeap  && heap[poz]>heap[poz*2+1]){
                /// Fiul din dreapta
                ok=1;
                swap(heap[poz], heap[poz*2+1]);
                poz=poz*2+1;
            }
        }
    }
}

void sterge(int poz){
    heap[poz]=heap[NumereInHeap];
    NumereInHeap--;
    if(poz>1 && heap[poz]<heap[poz/2]){
        VerificaTatii(poz);
    }else{
        VerificaFii(poz);
    }
}

int main(){
    fin>>operatii;
    for(int aux=1; aux<=operatii; aux++){
        fin>>t;
        if(t==3){
            fout<<heap[1]<<"\n";
        }
        if(t==1){
            n++;
            fin>>v[n];
            NumereInHeap++;
            heap[NumereInHeap]=v[n];
            VerificaTatii(NumereInHeap);
        }
        if(t==2){
            int PozitiaInVector;
            fin>>PozitiaInVector;
            val=v[PozitiaInVector];
            int poz=PozitiaInHeap(val);
            if(poz>0){
                sterge(poz);
            }
        }
    }
}