Cod sursa(job #2472523)

Utilizator Catalin2002Catalin Craciun Catalin2002 Data 12 octombrie 2019 15:58:36
Problema Heapuri Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.71 kb
#include <iostream>
#include <fstream>
using namespace std;

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

int n,m=0, n_heap=0;

struct data{

int val;
int poz;

}v[200005],aux2;

int poziti[200005];

bool schimbare(int i ,int j,bool sem)
{
    if(j <= 0 || j > n_heap || i<=0 || i>n_heap)
        return false;

    if(v[i].val<v[j].val||sem)
    {
        int aux = poziti[ v[j].poz ];
        poziti[ v[j].poz ] = poziti[ v[i].poz ];
        poziti[ v[i].poz ] = aux;

        aux2 = v[i];
        v[i] = v[j];
        v[j] = aux2;

        return true;
    }

    return false;
}

int minuml_dintre_copii(int i)
{
    if(i*2 > n_heap)
        return 0;

    if(i*2+1 > n_heap || v[i*2].val < v[i*2+1].val)
        return i*2;

    return i*2+1;
}

void inserare(int x)
{
    poziti[ ++m ] = ++n_heap ;

    v[ n_heap ].val = x;
    v[ n_heap ].poz = m;

    int i=n_heap;

    while(schimbare(i, i/2,0))
        i= i/2;


}

void stergere(int x)
{
    int i= v[n_heap].poz,a,b;

    if(poziti[x]==n_heap)
     {
         n_heap--;
         return;
     }

    schimbare( poziti[x] , n_heap ,1 );

    n_heap--;

    a= poziti[i];
    b= minuml_dintre_copii(a);

    while(schimbare( b,a,0 ) )
    {
        a= b;
        b= minuml_dintre_copii(a);
    }


}

int main()
{
    int i,x,c;

    fin>>n;


    for(i=1;i<=n;i++)
    {
        fin>>c;

        if(c==1)
        {
            fin>>x;
            inserare(x);
        }

        if(c==2)
        {
            fin>>x;
            stergere(x);
        }


        if(c==3)
        {
            fout<<v[1].val<<"\n";
        }

    }

    return 0;
}