Cod sursa(job #2104052)

Utilizator HoriaDruliacHoria Druliac HoriaDruliac Data 11 ianuarie 2018 02:11:28
Problema Heapuri Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 3.15 kb
#include <fstream>
#include <algorithm>
#define MA 200005

using namespace std;

ifstream fin ("heapuri.in");
ofstream fout ("heapuri.out");

int nro,tip,x,poz,nh,i,s,p,ult;
int d;
/// s- cate elemente cronologic
struct H
{
    int h,t;                                                                                    /// t este timpul cronologic
} H[MA];

int main()
{
    fin>>nro;
    for(int op=1; op<=nro; op++)
    {
        fin>>tip;
        if(tip==1)                                                                                  //Percolate
        {
            fin>>H[++i].h;                                                                      ///La final, i va reprezenta nr de elemente din Heap
            H[i].t=++s;
            poz=nh=i;
            while(1)
            {
                if(poz==1)
                    break;
                p=(poz>>1);                                                                   /// Aici impartim la 2, adica mergem la tatal sau sa vedem daca este mai mic
                if(H[poz].h<H[p].h)                                                         /// Daca parintele este mai mic decat elementul nou
                {
                    swap(H[poz].h,H[p].h);
                    swap(H[poz].t,H[p].t);
                    poz=p;
                }
                else break;
            }
        }
        else if(tip==2)
        {
            fin>>x;
            if(i==x)
                ult=i-1;
            else ult=i;
            int l;
            for(l=1; l<=i; l++)
                if(H[l].t==x)
                {
                    poz=l;
                    while (1)                                                    //il aducem sus
                    {
                        if (poz==1)
                            break;
                        p=(poz>>1);
                        swap(H[poz].h,H[p].h);
                        swap(H[poz].t,H[p].t);
                        poz=p;
                    }
                    //Schimbam primul cu ultimul
                    H[1].h=H[ult].h;
                    H[1].t=H[ult].h;                                            //sift
                    H[ult].h=0;
                    H[ult].h=0;
                    i--;
                    poz=1;
                    while(1)
                    {
                        if((poz<<1)>i)
                            break;
                        else
                        {
                            d=poz<<1;
                            if(d+1<=i)
                                if(H[d+1].h<H[d].h)
                                    d=d+1;
                            if(H[poz].h>H[d].h)
                            {
                                swap(H[poz].h,H[d].h);
                                swap(H[poz].t,H[d].t);
                                poz=d;
                            }
                            else break;
                        }
                    }
                    break;
                }
        }
        else
            fout<<H[1].h<<"\n";
    }
    fin.close();
    fout.close();
    return 0;
}