Cod sursa(job #2497055)

Utilizator eusebiu_alexandruMorar Eusebiu eusebiu_alexandru Data 21 noiembrie 2019 23:41:33
Problema Heapuri Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.64 kb
#include<fstream>
#define nmax 200001
using namespace std;
ifstream f ("heapuri.in");
ofstream g ("heapuri.out");
int heap[nmax],teste,Cerinta,x,n,ordine[nmax],poz[nmax],nr;
void inverseaza(int x,int y)
{
    int aux=heap[x];
    heap[x]=heap[y];
    heap[y]=aux;

    aux=ordine[x];
    ordine[x]=ordine[y];
    ordine[y]=aux;

    aux=poz[ordine[x]];
    poz[ordine[x]]=poz[ordine[y]];
    poz[ordine[y]]=aux;
}
void sift(int k)
{
    int fiu=1;
    while (fiu)
        {
            fiu=0;
            if (2*k<=n)
            {
                fiu=2*k;
                if (2*k+1<=n && heap[2*k+1]<heap[2*k])
                    fiu=2*k+1;
                if (heap[fiu]>heap[k])
                     fiu=0;
            }
            if (fiu)
                {
                    inverseaza(k,fiu);
                    k=fiu;
                }
        }
}
void percolate(int k)
{
    while (k>1&&heap[k]<heap[k/2])
        {
        inverseaza(k,k/2);
        k=k/2;
        }
}
void adauga(int k)
{
    heap[++n]=k,///in nodul n am valoarea k
    ordine[n]=++nr,/// nodul n este a nr valoare citita
    poz[nr]=n,/// la citirea a nr -a ii corespunde nodul n
    percolate(n);
}
void sterge(int k)
{
    heap[poz[k]]=heap[n];
    n--;
    sift(poz[k]);
}
int main()
{
    f>>teste;
    while(teste)
    {
        teste--;
        f>>Cerinta;
        if (Cerinta==1)
            {
            f>>x;
             adauga(x);
            }

        if (Cerinta==2)
            {
             f>>x;
            sterge(x);
            }
        if(Cerinta==3)
            g<<heap[1]<<endl;
    }
}