Cod sursa(job #2553840)

Utilizator rares9991Matisan Rares-Stefan rares9991 Data 22 februarie 2020 12:21:38
Problema Heapuri Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.38 kb
#include <fstream>

using namespace std;

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

/*

h[2i]=fiul stang al lui i;
h[2i+1]=fiul drept al lui i;
h[i/2]=tatal lui i;
inaltimea va fi [log2(n)];

HEAP: h[i] e mai bun (sau egal) ca fiii sai (h[2i], h[2i+1]);

h[i]=j : pe pozitia i in heap se afla al j-lea citit;
poz[j]=i : pozitia din heap a celui de-al j-lea citit este i;

=> h[poz[j]]=j; poz[h[i]]=i;

*/

const int N=200001;

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

void schimb(int p, int q)
{
    swap(h[p], h[q]);
    poz[h[p]]=p;
    poz[h[q]]=q;
}

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

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

void adauga(int x)
{
    h[++nh]=x;
    poz[x]=nh;
    urca(nh);
}

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

int main()
{
    int n, op, ct=0;
    in>>n;
    for(int i=1; i<=n; i++)
    {
        int x;
        in>>op;
        if(op==1)
        {
            ct++;
            in>>v[ct];
            adauga(ct);
        }
        else if(op==2)
        {
            in>>x;
            sterge(poz[x]);
        }
        else
            out<<v[h[1]]<<"\n";
    }
    return 0;
}