Cod sursa(job #1847130)

Utilizator feli2felicia iuga feli2 Data 14 ianuarie 2017 12:25:31
Problema Heapuri Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.54 kb
#include <iostream>
#include <fstream>

using namespace std;

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

const int NR=200005;
int H[NR], V[NR], x, N;

void sift(int k)
{
    int son;
    do
    {
        son=0;
        if(2*k<=N)
        {
            son=2*k;
            if((2*k+1<=N)&&(H[2*k+1]<H[son]))
            {
                son=2*k+1;
            }
            if(H[son]>H[k])
                son=0;
            if(son)
            {
                swap(H[k],H[son]);
                k=son;
            }
        }
    }
    while(son);
}

void percolate(int k)
{
    int key=H[k];
    while((k>1)&&(key<H[k/2]))
    {
        H[k]=H[k/2];
        k=k/2;
    }
    H[k]=key;
}

int _find(int k)
{
    if(k>N)
        return 0;
    if(H[k]==x)
        return k;
    if(H[k]>x)
        return 0;
    int f1=_find(2*k);
    int f2=_find(2*k+1);
    if(f1)
        return f1;
    if(f2)
        return f2;
}

int main()
{
    int n;
    fin>>n;
    for(int i=1;i<=n;i++)
    {
        int v;
        fin>>v;
        if(v==3)
        {
            fout<<H[1]<<'\n';
        }
        if(v==1)
        {
            fin>>x;
            N++;
            V[N]=x;
            H[N]=x;
            percolate(N);
        }
        if(v==2)
        {
            int nr;
            fin>>nr;
            x=V[nr];
            int k=_find(1);
            H[k]=H[N];
            N--;
            percolate(k);
            sift(k);
        }
    }
    return 0;
}