Cod sursa(job #1317982)

Utilizator maribMarilena Bescuca marib Data 15 ianuarie 2015 14:42:11
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.55 kb
#include <fstream>
#define DIM 200001
using namespace std;

int heap[DIM], lung, lim, x, poz[DIM], nr[DIM], p, add, n, com;

void adauga(int x)
{
    add++;
    lung++;
    lim=lung;
    while(heap[lim/2]>x&&lim>1)
    {
        heap[lim]=heap[lim/2];
        nr[lim]=nr[lim/2];
        poz[nr[lim]]=lim;
        lim/=2;
    }
    heap[lim]=x;
    nr[lim]=add;
    poz[add]=lim;
}

void sterge(int x)
{
    p=poz[x];
    swap(heap[p], heap[lung]);
    swap(nr[p], nr[lung]);
    poz[nr[p]]=p; poz[nr[lung]]=lung;
    lung--;
    while(heap[p]<heap[p/2]&&p>1)
    {
        heap[p]=heap[p/2];
        p=p/2;
    }
    while((heap[p]>heap[2*p]||heap[p]>heap[2*p+1])&&(2*p<=lung))
    {
        if((heap[2*p]<heap[2*p+1]||(2*p+1>lung))&&(2*p<=lung))
        {
            swap(heap[p], heap[2*p]);
            swap(nr[p], nr[2*p]);
            poz[nr[p]]=p; poz[nr[2*p]]=2*p;
            p=2*p;
        }
        else if(2*p+1<=lung)
        {
            swap(heap[p], heap[2*p+1]);
            swap(nr[p], nr[2*p+1]);
            poz[nr[p]]=p; poz[nr[2*p+1]]=2*p+1;
            p=2*p+1;
        }
    }
}

int main()
{
    ifstream in("heapuri.in");
    ofstream out ("heapuri.out");
    in>>n;
    for(int i=1; i<=n; ++i)
    {
        in>>com;
        if(com==1)
        {
            in>>x;
            adauga(x);
        }
        else if(com==2)
        {
            in>>x;
            sterge(x);
        }
        else
            out<<heap[1]<<"\n";
    }
    in.close();
    out.close();
    return 0;
}