Cod sursa(job #794505)

Utilizator crazzytudTudor Popa crazzytud Data 6 octombrie 2012 14:11:06
Problema Heapuri Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 1.39 kb
#include<fstream>
using namespace std;
int n,u;
ifstream in("heapuri.in");
ofstream out("heapuri.out");
int v[200001],heap[200001],poz[200001];
void urca(int p)
{
    int aux;
    while(p>1 && v[heap[p]] < v[heap[p/2]])
    {
        aux = heap[p];
        heap[p] = heap[p/2];
        heap[p/2] = aux;

        aux = poz[heap[p]];
        poz[heap[p]] = poz[heap[p/2]];
        poz[heap[p/2]] = aux;

        p/=2;
    }
}


void coboara(int p)
{
    int fs = 2*p;
    int fd = 2*p + 1;
    int bun = p;
    int aux;
    if(fs<=u && v[heap[fs]] < v[heap[bun]])
        bun = fs;
    if(fd<=u && v[heap[fd]] < v[heap[bun]])
        bun = fd;

    if(bun!=p)
    {
        aux = heap[p];
        heap[p] = heap[bun];
        heap[bun] = aux;

        aux = poz[heap[p]];
        poz[heap[p]] = poz[heap[bun]];
        poz[heap[bun]] = aux;
        coboara(bun);
    }

}

int main()
{

    int op,x;

    in>>n;

    for(int i=1;i<=n;i++)
    {
        in>>op;

        if(op==1)
        {
            in>>v[++u];
            heap[u] = u;
            poz[u] = u;
            urca(u);
        }

        if(op==2)
        {
            in>>x;
            //adadssad
            heap[poz[x]] = heap[u];
            coboara(poz[x]);
            urca(poz[x]);
        }
        if(op==3)
        {
            out<<v[heap[1]]<<"\n";
        }
    }
}