Cod sursa(job #2148446)

Utilizator vladboss2323Ciorica Vlad vladboss2323 Data 1 martie 2018 18:44:01
Problema Heapuri Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.71 kb
#include <iostream>
#include <fstream>
using namespace std;

ifstream in("heapuri.in");
ofstream out("heapuri.out");
/*
h[1] = radacina (minimul)
h[2*i] = fiul stang al lui i
h[2*i+1] = fiul drept al lui i
=> h[i/2] = tatal lui i

pentru a avea heap vom avea grija ca h[i] sa fie mai mic decat h[2*i] si h[2*i+1]

adaugarea lui x in heap:
h[++nh] = x;
urca(nh);

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

stergerea celui de pe pozitia p in heap:
swap(h[p], h[nh--]);
urca(p);
coboara(p);

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

/*
v[i] = al i-lea citit
h[i] = heap-ul (in care pastram pozitii din v): la urca vom compara v[h[p]] cu v[h[p/2]]
poz[j] = i <=> h[i] = j
poz[h[i]] = i
*/
const int N=200005;

int h[N],n,a[N],k=0,poz[N],q,v[N];

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

void coboara(int p)
{
    int fs=2*p,fd=2*p+1,bun=p;
    //out<<h[fs]<<" "<<h[fd]<<" "<<h[bun]<<endl;
    if(fs<=q && v[h[fs]]< v[h[bun]])
        bun=fs;
    if(fd<=q && v[h[fd]]< v[h[bun]])
        bun=fd;
    if(bun!=p)
    {
        swap(h[p],h[bun]);
        coboara(bun);
    }
}

void sterge(int nod)
{
    swap(h[nod],h[q--]);
    coboara(nod);
}

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

int main()
{
    int i,j,x,y;
    in>>n;
    for(i=1; i<=n; i++)
    {
        in>>x;
       // out<<x<<endl;
        if(x==3)
        {
            out<<v[h[1]]<<endl;
        }
        else
        {
            if(x==1)
            {
                in>>y;
                v[++k]=y;
                h[++q]=k;
                poz[k] = q;
                urca(k);
            }
            if(x==2)
            {
                in>>y;
                sterge(poz[y]);
            }

        }
        /*for(j=1; j<=n; j++)
            out<<poz[j]<<" ";
        out<<endl;
        for(j=1; j<=k; j++)
            out<<v[j]<<" ";
        out<<endl;
        for(j=1; j<=q; j++)
            out<<h[j]<<" ";
        out<<endl;

        out<<endl;
        */


    }
    /*
    i=0;
    while(i<n)
    {
        in>>h[++i];
        urca(i);
    }
    for(i=1;i<=n;i++)
        out<<h[i]<<" ";
    out<<endl;
    while(n>0)
        sterge(1);
    for(i=1; i<=k; i++)
        out<<a[i]<<" ";
        */
    return 0;
}