Cod sursa(job #2858127)

Utilizator Mihai_EduardMihai Eduard Mihai_Eduard Data 27 februarie 2022 01:42:21
Problema Heapuri Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.64 kb
#include <bits/stdc++.h>

using namespace std;

ifstream fin("heapuri.in");
ofstream fout("heapuri.out");
const int NMAX=200005;

int N, L, v[NMAX], heap[NMAX], val[NMAX], poz[NMAX];

void upHeap(int p){
    while(p>1 and val[heap[p]]<val[heap[p/2]]){
        swap(poz[heap[p]],poz[heap[p/2]]);
        swap(heap[p],heap[p/2]);
        p=p/2;
    }
}

void downHeap(int p){
    while(p*2+1<=L and (val[heap[2*p]]<val[heap[p]] or val[heap[2*p*1]]<val[heap[p]])){
        if(val[heap[2*p]]<val[heap[2*p+1]]){
            swap(poz[heap[p]],poz[heap[p*2]]);
            swap(heap[p],heap[p*2]);
            p=p*2;
        }
        else{
            swap(poz[heap[p]],poz[heap[p*2+1]]);
            swap(heap[p],heap[p*2+1]);
            p=p*2+1;
        }
    }
    if(p*2==L and val[heap[2*p]]<val[heap[p]]){
        swap(poz[heap[p]],poz[heap[p*2]]);
        swap(heap[p],heap[p*2]);
        p=p*2;
    }
}

void pushHeap(int i){
    L++;
    poz[i]=L;
    heap[L]=i;
    upHeap(L);
}

int getMinHeap(){
    return val[heap[1]];
}

void popHeap(int p){
    swap(poz[heap[p]],poz[heap[L]]);
    swap(heap[p],heap[L]);
    L--;
    if(p>1 and val[heap[p]]<val[heap[p/2]])
        upHeap(p);
    else
        downHeap(p);
}

int main()
{
    fin>>N;
    int t, x, i=0;
    while(N--){
        fin>>t;
        if(t==1){
            fin>>x;
            val[++i]=x;
            pushHeap(i);
        }
        else if(t==2){
            fin>>x;
            popHeap(poz[x]);
        }
        else{
            fout<<getMinHeap()<<'\n';
        }
    }

    fin.close();
    fout.close();
    return 0;
}