Cod sursa(job #3272613)

Utilizator deliaandreeaddelia andreea deliaandreead Data 30 ianuarie 2025 11:11:14
Problema Heapuri Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.51 kb
#include <iostream>
#include <fstream>

using namespace std;

ifstream fin ("heapuri.in");
ofstream fout ("heapuri.out");

struct poz_init{
    int poz;
    int nr;
};

poz_init v[200003];//mini heap ul
bool viu[200003];//pastrez statusul elem de pe poz init

bool exista(int poz,int ult_poz){//+ daca tatal e mai mic ca fiul(eu intru cu fiul)
    return poz<=ult_poz && poz>=1 && v[poz/2].nr>v[poz].nr;
}


int main()
{
    int m;
    fin>>m;
    int ult_poz=0;//ca sa am acces la ult elem inserat
    for(int i=1;i<=m;i++){
        int cer;
        fin>>cer;
        if(cer==1){
            ///citire
            ult_poz++;
            int x;
            fin>>x;
            viu[ult_poz]=true;
            v[ult_poz].nr=x;
            v[ult_poz].poz=ult_poz;//o sa se schimbe pozitia pe care e initial in heap
            ///rearenjez corect elem
            int p=ult_poz;
            while(p>1 && v[p/2].nr>v[p].nr){//tatal> fiul
                swap(v[p],v[p/2]);
                p/=2;
            }
        }
        else if(cer==2){
            ///setez ca mort numarul de pe poz initiala x
            int x;
            fin>>x;
            viu[x]=false;
        }
        else if(cer==3){
            ///verif daca elem min e mort
            while(viu[v[1].poz]==false && ult_poz>=1){
                ///sterg mortul
                swap(v[1],v[ult_poz]);
                ult_poz--;
                ///corectez heap ul
                int n=1;
                while( exista(2*n+1, ult_poz) || exista(2*n, ult_poz) ){//daca min 1 fiu exista
                    if( exista(2*n, ult_poz) && exista(2*n+1, ult_poz)){//daca exista ambii
                        if(v[2*n].nr<=v[2*n+1].nr){//f1<=f2
                            swap(v[n],v[2*n]);
                            n=2*n;
                        }
                        else{//f2<f1
                            swap(v[n],v[2*n+1]);
                            n=2*n+1;
                        }
                    }
                    else if(exista(2*n, ult_poz)){//daca doar f1 exista
                        swap(v[n],v[2*n]);
                        n=2*n;
                    }
                    else if(exista(2*n+1, ult_poz)){//daca doar f2 exista
                        swap(v[n],v[2*n+1]);
                        n=2*n+1;
                    }
                }
            }
            ///afisez elem min
            if(ult_poz>=1)
                fout<<v[1].nr<<'\n';
        }
    }
    return 0;
}