Cod sursa(job #1971987)

Utilizator dianamichesaRosu Diana Michesa dianamichesa Data 21 aprilie 2017 13:58:36
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.02 kb
#include <iostream>
#include <fstream>

using namespace std;

ifstream f("heapuri.in");
ofstream g("heapuri.out");
const int N=200001;

int nh,h[N],v[N],n,nr,poz[N];

void schimba(int p,int q)
{
    int aux=h[p];
    h[p]=h[q];
    h[q]=aux;
    poz[h[p]]=p;
    poz[h[q]]=q;
}

void urca(int p)
{
    while(p>1 && v[h[p]]<v[h[p/2]]){
        schimba(p,p/2);
        p/=2;
    }
}

void coboara(int p)
{
    int fs=2*p,fd=2*p+1,bun=p;
    if(fs<=nh && v[h[fs]]<v[h[bun]])
        bun=fs;
    if(fd<=nh && v[h[fd]]<v[h[bun]])
        bun=fd;
    if(bun!=p){
        schimba(bun,p);
        coboara(bun);
    }
}

void sterge(int p)
{
    schimba(p,nh);
    nh--;
    urca(p);
    coboara(p);
}

int main()
{
    f>>n;
    int x,k;
    for(int i=1;i<=n;i++){
        f>>k;
        if(k==1){
            f>>v[++nr];
            h[++nh] = nr;
            poz[nr] = nh;
            urca(nh);
        }
        if(k==2){
            f>>x;
            sterge(poz[x]);
        }
        if(k==3)
            g<<v[h[1]]<<'\n';
    }
    return 0;
}