Cod sursa(job #2625629)

Utilizator SirbuSirbu Ioan Sirbu Data 6 iunie 2020 02:37:58
Problema Heapuri Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.55 kb
#include <bits/stdc++.h>

using namespace std;

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


struct heap {
    int val,ind;

}h[200100];

int k,poz[200100];

void up(int nod) {

    if(nod/2>0) {
        if(h[nod].val<h[nod/2].val) {
            poz[h[nod].ind]=nod/2;
            poz[h[nod/2].ind]=nod;
            swap(h[nod],h[nod/2]);
            up(nod/2);
        }
    }
}

void down(int nod) {

    if(2*nod<=k && 2*nod+1<=k && h[nod].val>min(h[2*nod].val,h[2*nod+1].val)) {
        if(h[2*nod].val<h[2*nod+1].val) {
            poz[h[2*nod].ind]=nod;
            poz[h[nod].ind]=2*nod;
            swap(h[nod],h[2*nod]);
            down(2*nod);
        }

        else {
            poz[h[2*nod+1].ind]=nod;
            poz[h[nod].ind]=2*nod+1;
            swap(h[nod],h[2*nod+1]);
            down(2*nod+1);
        }
    }

    else if(2*nod<=k && h[nod].val>h[2*nod].val) {
        poz[h[2*nod].ind]=nod;
        poz[h[nod].ind]=2*nod;
        swap(h[nod],h[2*nod]);
        down(2*nod);
    }
}

int n,i,poz_in_heap,op,x;

int main() {

    fin>>n;
    for(i=1;i<=n;i++) {

        fin>>op;
        if(op==1) {

            fin>>x;
            k++;
            h[k].val=x;
            h[k].ind=k;
            poz[k]=k;
            up(k);
        }
        else if(op==2) {

            fin>>x;
            poz_in_heap=poz[x];
            h[poz_in_heap].val=INT_MAX;
            down(poz_in_heap);
        }

        else
            fout<<h[1].val<<'\n';

    }
    return 0;
}