Cod sursa(job #2892277)

Utilizator bogdanputineluBogdan Putinelu bogdanputinelu Data 21 aprilie 2022 15:54:49
Problema Heapuri Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.61 kb
#include <fstream>
using namespace std;
int v[200010],ordine[200010],pozitie[200010];
void baga(int m){
    int elem=v[m];
    while(m/2 && elem<v[m/2]){
        v[m]=v[m/2];
        pozitie[ordine[m]]= m / 2;
        pozitie[ordine[m / 2]]=m;
        swap(ordine[m], ordine[m / 2]);
        m/=2;
    }
    v[m]=elem;
}
void repara(int m, int pozi){
    int fiu;
    do{
        fiu=0;
        if(pozi * 2 <= m){
            fiu= pozi * 2;
            if(pozi * 2 + 1 <= m && v[pozi * 2 + 1] < v[pozi * 2])
                fiu= pozi * 2 + 1;
            if(v[fiu]>=v[pozi])
                fiu=0;
        }
        if (fiu){
            swap(v[fiu],v[pozi]);
            swap(pozitie[ordine[fiu]], pozitie[ordine[pozi]]);
            swap(ordine[fiu], ordine[pozi]);
            pozi=fiu;
        }
    } while (fiu);
}
void sterge(int &m,int sterg){
    sterg=pozitie[sterg];
    v[sterg]=v[m];
    pozitie[ordine[m]]=pozitie[ordine[sterg]];
    ordine[sterg]=ordine[m];
    m--;

    if(sterg>1 && v[sterg]<v[sterg/2])
        baga(sterg);
    else
        repara(m,sterg);

}
int main(){
    ifstream f("heapuri.in");
    ofstream g("heapuri.out");
    int n,op,x,m=0,introdus=0;
    f>>n;
    for(int i=0;i<n;++i){
        f>>op;
        if(op==3){
            g<<v[1]<<'\n';
        }
        else
            if(op==1){
                f>>x;
                m++;
                v[m]=x;
                introdus++;
                ordine[m]=introdus;
                pozitie[ordine[introdus]]=m;
                baga(m);
            }
            else{
                f>>x;
                sterge(m,x);
            }
    }
    return 0;
}