Cod sursa(job #2886907)

Utilizator petru.theodor07Petru Cristea petru.theodor07 Data 8 aprilie 2022 16:31:10
Problema Heapuri Scor 30
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.26 kb
#include<bits/stdc++.h>
const int N = 1<<9;
using namespace std;

int V[N], h[N], poz[N], nh;


void un_fel_de_swap(int a, int b){
    swap(h[a], h[b]);
    poz[h[a]] = a;
    poz[h[b]] = b;
}

void up(int p){
    while(p>1 && V[h[p]] < V[h[p/2]]){
        un_fel_de_swap(p, p/2);
        p/=2;
    }
}

void un_fel_de_push(int x){
    h[++nh] = x;
    poz[x] = nh;
    up(nh);
}

void coboara(int p){
    int st=2*p, dr = 2*p+1, ok = p;
    if(st<=nh && V[h[st]] < V[h[ok]])
        ok=st;
    if(dr<=nh && V[h[dr]] < V[h[ok]])
        ok=dr;
    if(ok!=p){
        un_fel_de_swap(p, ok);
        coboara(ok);
    }
}

void un_fel_de_delete(int p){
    if(p==nh){
        nh--;
    }
    else{
        h[p] = h[nh--];
        poz[h[p]] = p;
        up(p);
        coboara(p);
    }
}

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

int main(){
    int nrop, n=0;
    fin>>nrop;
    for(int i=0; i<nrop; i++){
        int op;
        fin>>op;
        if(op==1){
            fin>>V[++n];
            un_fel_de_push(n);
        }
        if(op==2){
            int p;
            fin>>p;
            un_fel_de_delete(poz[p]);
        }
        if(op==3){
            fout<<V[h[1]]<<'\n';
        }
    }
}