Cod sursa(job #2916337)

Utilizator carinamariaCarina Maria Viespescu carinamaria Data 29 iulie 2022 12:55:12
Problema Heapuri Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.41 kb
#include <fstream>
using namespace std;
ifstream cin("heapuri.in");
ofstream cout("heapuri.out");
int v[200005], h[200005], poz[200005], n, op, x, y, a[200005], k;
void adauga(int aux){
    while(aux>1 && a[v[aux]]<a[v[aux/2]]){
        swap(v[aux], v[aux/2]);
        swap(poz[v[aux]], poz[v[aux/2]]);
        aux=aux/2;
    }
}
void sterge(int p){
    if(p==n)
        n--;
    else{
        swap(v[p], v[n]);
        swap(poz[v[p]], poz[v[n]]);
        n--;
        int aux=p;
        int p1=aux;
        while(aux>1 && a[v[aux]]<a[v[aux/2]]){
            swap(v[aux], v[aux/2]);
            swap(poz[v[aux]], poz[v[aux/2]]);
            p1=aux/2;
            aux=aux/2;
        }
        int c=2*p1;
        while(c<=n){
            if(c+1<=n && a[v[c+1]]<a[v[c]])
                c++;
            if(a[v[c]]<a[v[p1]]){
                swap(v[c], v[p1]);
                swap(poz[v[c]], poz[v[p1]]);
            }
            else
                break;
            p1=c;
            c=2*p1;
        }

    }
}

int main(){
    int i, nop;
    cin>>op;
    for(i=1;i<=op;i++){
        cin>>x;
        if(x==1){
            cin>>y;
            a[++k]=y;
            v[++n]=k;
            poz[k]=n;
            adauga(n);
        }
        if(x==2){
            cin>>y;
            sterge(poz[y]);
        }
        if(x==3){
            cout<<a[v[1]]<<"\n";
        }
    }
}