Cod sursa(job #1267602)

Utilizator LegionHagiu Stefan Legion Data 20 noiembrie 2014 01:19:40
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.87 kb
#include <iostream>
#include <fstream>
using namespace std;
int heap[200001],val[200001],pozitii[200001],s;
inline int tata(int n)
{
    return n/2;
}
inline int fiustanga(int n)
{
    return 2*n;
}
inline int fiudreapta(int n)
{
    return 2*n+1;
}
void sus (int k)
{
    while (tata(k)>=1&&val[heap[tata(k)]]>val[heap[k]])
    {
          swap(heap[tata(k)],heap[k]);
          swap(pozitii[heap[k]],pozitii[heap[tata(k)]]);
          k=tata(k);
    }
}
void jos(int k)
{
    bool merje=true;
    int fiu;
    while (merje)
    {
        merje=false;
        if (fiudreapta(k)<=s&&val[heap[fiudreapta(k)]]<val[heap[k]])
        {
            merje=true;
            if (val[heap[fiustanga(k)]]>val[heap[fiudreapta(k)]])
            {
                fiu=fiudreapta(k);
            }
            else
            {
                fiu=fiustanga(k);
            }
        }
        else if (fiustanga(k)<=s&&val[heap[fiustanga(k)]]<val[heap[k]])
        {
            merje=true;
            fiu=fiustanga(k);
        }
       if (merje)
        {
           swap(heap[k],heap[fiu]);
           swap(pozitii[heap[k]],pozitii[heap[fiu]]);
           k=fiu;
        }
    }
}
int main()
{
    ifstream in("heapuri.in");
    ofstream out("heapuri.out");
    int i,cod,n,x,tot=0,j;
    in>>n;
    for (i=1;i<=n;i++)
    {
        in>>cod;
        if (cod==1)
        {
            s++;
            tot++;
            pozitii[tot]=s;
            heap[s]=tot;
            in>>val[tot];
            sus(s);
        }
        if (cod==2)
        {
            in>>x;
            x=pozitii[x];
            swap(heap[x],heap[s]);
            swap(pozitii[heap[x]],pozitii[heap[s]]);
            s--;
            sus(x);
            jos(x);
        }
        if (cod==3)
        {
            out<<val[heap[1]]<<"\n";
        }
    }
}