Cod sursa(job #1735900)

Utilizator adina0822Ciubotaru Adina-Maria adina0822 Data 31 iulie 2016 16:04:06
Problema Heapuri Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.79 kb
using namespace std;
#include<fstream>

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

int n;
int H[200001],nr; //heap
int ord[200001],l; // ord[i] - pozitia in heap a elementului intrat al i-lea in multime (de ordin i sa spunem)
int pos[200001]; // pos[i] - pozitia din ord[] la care gasim elementul i din heap


int main()
{
    int i,j,o,x,aux;

    f>>n;

    while(n--)
    {
        f>>o;

        if(o==1)
        {
            f>>x;
            H[++nr]=x;
            ord[++l]=l;
            pos[nr]=l;
            i=nr;
            while(i>1)
            {
                if(H[i]<H[i/2])
                {
                    aux=H[i];
                    H[i]=H[i/2];
                    H[i/2]=aux;
                    aux=ord[pos[i]];
                    ord[pos[i]]=ord[pos[i/2]];
                    ord[pos[i/2]]=aux;
                    aux=pos[i];
                    pos[i]=pos[i/2];
                    pos[i/2]=aux;
                    i=i/2;

                }
                else i=1;
            }
        }

        else if(o==2)
        {
            f>>x;
            H[ord[x]]=H[nr];
            pos[ord[x]]=pos[nr];
            ord[pos[nr]]=ord[x];
            nr--;
            i=ord[x];
            while(i*2<=nr)
            {
                j=2*i;
                if(j+1<=nr && H[j+1]<H[j]) j++;
                if(H[i]>H[j])
                {
                    aux=H[i];
                    H[i]=H[j];
                    H[j]=aux;
                    aux=ord[pos[i]];
                    ord[pos[i]]=ord[pos[j]];
                    ord[pos[j]]=aux;
                    i=j;
                }
                else i=nr/2+2;
            }
        }

        else g<<H[1]<<'\n';

    }



    return 0;
}