Cod sursa(job #1848807)

Utilizator feli2felicia iuga feli2 Data 16 ianuarie 2017 17:56:28
Problema Heapuri Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.67 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, H2[NR];

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]);
                swap(H2[k],H2[son]);
                V[H2[k]]=k;
                k=son;
            }
        }
    }
    while(son);
}

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

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++;
            H[N]=x;
            H2[N]=N;
            percolate(N);
        }
        if(v==2)
        {
            int nr;
            fin>>nr;
            int k=V[nr];
            H[k]=H[N];
            N--;
            percolate(k);
            sift(k);
        }
    }
    return 0;
}