Cod sursa(job #2892181)

Utilizator bogdanputineluBogdan Putinelu bogdanputinelu Data 21 aprilie 2022 00:26:39
Problema Heapuri Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.55 kb
#include <fstream>
using namespace std;
int v[200010],poz[200010];
void baga(int v[],int poz[],int m){
    int elem=v[m],pozitie=poz[m];
    while(m>1 && elem<v[m/2]){
        v[m]=v[m/2];
        poz[m]=poz[m/2];
        m/=2;
    }
    v[m]=elem;
    poz[m]=pozitie;
}
void repara(int v[],int poz[],int m, int pozitie){
    int fiu;
    do{
        fiu=0;
        if(pozitie*2<=m){
            fiu=pozitie*2;
            if(pozitie*2+1<=m && v[pozitie*2+1] < v[pozitie*2])
                fiu=pozitie*2+1;
            if(v[fiu]>=v[pozitie])
                fiu=0;
        }
        if (fiu){
            swap(v[fiu],v[pozitie]);
            swap(poz[fiu],poz[pozitie]);
            pozitie=fiu;
        }
    } while (fiu);
}
void sterge(int v[],int poz[],int &m,int sterg){
    for(int i=1;i<=m;++i) {
        if (poz[i] == sterg) {
            sterg=i;
            break;
        }
    }
    v[sterg]=v[m];
    poz[sterg]=poz[m];
    m--;

    if(sterg>1 && v[sterg]<v[sterg/2])
        baga(v,poz,sterg);
    else
        repara(v,poz,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++;
                poz[m]=introdus;
                baga(v,poz,m);
            }
            else{
                f>>x;
                sterge(v,poz,m,x);
            }
    }

    return 0;
}