Cod sursa(job #661746)

Utilizator blk.irineluIrina Ursateanu blk.irinelu Data 15 ianuarie 2012 00:59:00
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.78 kb
#include <fstream>

using namespace std;

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

const int maxn=200010;
int heap[maxn],poz[maxn],val[maxn],n,lung,N;

void swap(int i,int j)
{
    int aux=heap[i];
    heap[i]=heap[j];
    heap[j]=aux;
}

void urca(int nod)
{
    while(nod>1&& val[heap[nod]]<val[heap[nod/2]]) // nod/2 indica tatalif
     {
         swap(nod,nod/2);
         poz[heap[nod]]=nod;
         poz[heap[nod/2]]=nod/2;
         nod=nod/2;
     }
}

void coboara(int nod)
{
    while((nod*2<=N && val[heap[nod*2]]<val[heap[nod]])||(nod*2+1<=N && val[heap[nod*2+1]]<val[heap[nod]]))
    {
        if(nod*2+1<=N)
        {
        if(val[heap[nod*2]]<val[heap[nod*2+1]])
        {
            swap(nod,nod*2);
            poz[heap[nod]]=nod;
            poz[heap[nod*2]]=nod*2;
            nod=nod*2;
        }
        else
        {
            swap(nod,nod*2+1);
            poz[heap[nod]]=nod;
            poz[heap[nod*2+1]]=nod*2+1;
            nod=nod*2+1;
        }
        }
        else
        {
            swap(nod,nod*2);
            poz[heap[nod]]=nod;
            poz[heap[nod*2]]=nod*2;
            nod=nod*2;
        }
    }
}

void push(int x)
{
    lung++;
    val[lung]=x;
    N++;
    heap[N]=lung;
    poz[lung]=N;
    urca(N);
}

void pop(int x)
{
    val[x]=-1;
    urca(poz[x]);
    poz[heap[1]]=0;
    heap[1]=heap[N--];
    poz[heap[1]]=1;
    if(N>1) coboara(1);
}

int main()
{
    f>>n;
    for(;n;n--)
    {
        int op,x;
        f>>op;
        if(op==1)
        {
            f>>x;
            push(x);
        }
        if(op==2)
        {
            f>>x;
            pop(x);
        }
        if(op==3)
         g<<val[heap[1]]<<"\n";
    }
    return 0;
}