Cod sursa(job #2506578)

Utilizator bodea.georgianaBodea Georgiana bodea.georgiana Data 8 decembrie 2019 14:01:44
Problema Heapuri Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.86 kb
#include <fstream>
#define N 200002

using namespace std;

int heap[N],where[N],intr[N],n,cate;

void sift(int x, int i, int ord)
{
    int son,alc;
    do
    {
        son=0;
        if(2*i<=cate)//are fiu stang
        {
            son=2*i;
            if(2*i+1<=cate && heap[2*i+1]<heap[2*i])
                son=2*i+1;
        }
        if(son && x>heap[son])
        {
            heap[i]=heap[son];
            alc=where[son];
            intr[alc]=i;
            where[i]=alc;
            i=son;
        }
        else
            son=0;
    }while(son!=0);
    heap[i]=x;
    where[i]=ord;
    intr[ord]=i;
}
void percolate(int x, int i, int ord)
{
    int alc;
    while(i>1 && x<heap[i/2])
    {
        heap[i]=heap[i/2];
        alc=where[i/2];
        intr[alc]=i;
        where[i]=alc;
        i/=2;
    }
    heap[i]=x;
    intr[ord]=i;
    where[i]=ord;
}
void cut(int ord)
{
    int i=intr[ord];
    heap[i]=heap[cate];
    ord=where[cate];
    intr[ord]=i;
    where[i]=ord;
    --cate;
    if(i>1 && heap[i]<heap[i/2])
        percolate(heap[i],i,ord);
    else
            sift(heap[i],i,ord);
}
void put(int x,int i, int ord)
{
    heap[i]=x;
    intr[ord]=i;
    where[i]=ord;
    percolate(x,i,ord);///cand inserezi valoarea e pusa tot timpul ultima si atunci compari mereu doar cu tata
}
int main()
{
    ifstream f("heapuri.in");
    ofstream g("heapuri.out");
    int x,cod,ord=0,which,i=0;
    f>>n;
    for(int k=1;k<=n;++k)
    {
        f>>cod;
        if(cod==1)
        {
            f>>x;
            ++cate;
            put(x,++i,++ord);
        }
        else
            if(cod==2)
            {
               f>>which;
               cut(which);
            }
            else
                g<<heap[1]<<"\n";
    }
    f.close();
    g.close();
    return 0;
}