Cod sursa(job #1052288)

Utilizator SorinaSmeureanuSorina Smeureanu SorinaSmeureanu Data 11 decembrie 2013 00:29:09
Problema Heapuri Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.59 kb
#include<iostream>
#include<fstream>
#include<algorithm>

using namespace std;

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

#define M 200010

int ord[M], poz[M], v[M], nr, tip, x;

void urca (int n, int pozi)
{
    while(pozi>1 && v[poz[pozi]]<v[poz[pozi/2]])
    {
        swap(v[pozi], v[pozi/2]);
        swap(ord[pozi], ord[pozi/2]);
        pozi=pozi/2;
    }
}

void coboara(int n, int pozi)
{
     int son;
     do
     {
         son=0;
         if(2*pozi<=n)
         {
             son=2*pozi;
             if(2*pozi+1<=n && v[poz[2*pozi+1]]<v[poz[2*pozi]])
                son=2*pozi+1;
         if(v[son]>=v[pozi])
            son=0;
         }
         if(son)
         {
             swap(v[pozi], v[son]);
             poz[v[pozi]]=son;
             poz[v[son]]=pozi;
             pozi=son;
         }
     }while(son);
}
int main()
{
    int i, n=0, j, ok, k=0;
    f>>nr;
    for(i=1;i<=nr;i++)
    {
        f>>tip;
        if(tip==1)
        {
            f>>x;
            n++;
            k++;
            v[n]=x;
            poz[n]=k;
            ord[n]=k;
            urca(n, k);
        }
        if(tip==2)
        {
            f>>x;
            ok=0;
            j=1;
            while(j<=n && ok==0)
            {
                if(ord[j]==x)
                    ok=1;
                j++;
            }
            j--;
            v[j]=v[n];
            ord[j]=ord[n];
            n--;
            urca(n, j);
            coboara(n, 1);
        }
        if(tip==3)
            g<<v[1]<<'\n';
    }

}