Cod sursa(job #2294106)

Utilizator miruna1224Floroiu Miruna miruna1224 Data 1 decembrie 2018 21:52:04
Problema Heapuri Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.35 kb
#include <iostream>
#include <fstream>

using namespace std;

const int N = 200010;

int dim, m;

struct Tip
{
    int info, poz;
} v[N];


void afis()
{
    int i;
    cout << "info\n";
    for( i=0 ; i< dim; i++)
        cout << v[i].info << " ";
    cout << "\n";
    cout << "poz\n";
    for( i=0 ; i< dim; i++)
        cout << v[i].poz << " ";
    cout << "\n";
}

void heapify( int root )
{
    //Determinam minimul dintre root si cei 2 fii ai sai
    int minimum = root;
    int lc = 2*root ;
    int rc = 2*root + 1;

    if (lc < dim && v[lc].info < v[minimum].info)
        minimum = lc;

    if (rc < dim && v[rc].info < v[minimum].info)
        minimum = rc;

    //Daca unul dintre cei 2 fii contine o valoarea mai mare decat cea din radacina,
    //interschimbam cele doua valori si refacem structura de heap a subarborelui fiului respectiv
    if (minimum != root)
    {
        swap(v[root], v[minimum]);
        heapify( minimum);
    }
}

//Functie care sorteaza un tablou v format din n elemente
void heapSort( )
{
    //Se construieste heap-ul initial
    for (int i = dim/2-1; i >= 0; i--)
        heapify(i);

    //De n ori efectuam urmatoarele operatii
    for (int i = dim-1; i >= 0; i--)
    {
        //Interschimbam valoarea minima din heap (v[0])
        //cu ultima valoare din subarborele curemt (v[i])
        swap(v[0], v[i]);

        //Refacem structura de heap a arborelui redus
        heapify( 0);
    }
}


void adaugare( int x )
{
    v[dim].info = x;
    v[dim++]. poz = m++;
}

void stergere ( int x)
{
    int i, j;
    x--;
    for ( j = 0 ; j < dim ; j++)
        if(v[j].poz == x)
        {
            i = j;
            break;
        }
    dim --;
    for ( ; i < dim; i++ )
        v[i] = v[i+1];
    heapify( 0 );
    //afis ();
}

int minim()
{
    heapSort();
    return v[0].info ;
}

int main()
{
    ifstream in("heapuri.in");
    ofstream out( "heapuri.out");

    int n, op, i, x;

    in >> n;
    for (i = 0; i < n; i++)
    {
        in >> op ;
        if ( op == 3)
            out << minim () << "\n";
        else
        {
            in >> x;
            if ( op == 1)
                adaugare ( x );
            else
                stergere ( x );
        }
    }

    in.close();
    out.close();

    return 0;
}