Cod sursa(job #2443150)

Utilizator mirceaisherebina mircea mirceaishere Data 26 iulie 2019 18:05:09
Problema Heapuri Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.73 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], PozitiaInHeap[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 && v[valoare]<v[heap[poz/2]]){
        ///swap(PozitiaInHeap[ heap[poz] ], PozitiaInHeap[ heap[poz/2] ]);
        ///heap[poz]=heap[poz/2];
        swap(heap[poz], heap[poz/2]);
        PozitiaInHeap[ heap[poz] ] = poz;
        PozitiaInHeap[ heap[poz/2] ] = poz/2;
        poz=poz/2;
    }
///    heap[poz]=valoare;
}

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

void sterge(int poz){
    ///swap(PozitiaInHeap[ heap[poz] ], PozitiaInHeap[ heap[NumereInHeap] ]);
    heap[poz]=heap[NumereInHeap];
    PozitiaInHeap[ heap[poz] ] = poz;
    NumereInHeap--;
    if(poz>1 && v[heap[poz]]<v[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<<v[heap[1]]<<"\n";
        }
        if(t==1){
            n++;
            fin>>v[n];
            NumereInHeap++;
            heap[NumereInHeap]=n;
            PozitiaInHeap[n]=NumereInHeap;
            VerificaTatii(NumereInHeap);
        }
        if(t==2){
            int PozitiaInVector;
            fin>>PozitiaInVector;
            val=v[PozitiaInVector];
            int poz=PozitiaInHeap[PozitiaInVector];
            if(poz>0){
                sterge(poz);
            }
        }
    }
}