Cod sursa(job #1704027)

Utilizator felipeGFilipGherman felipeG Data 17 mai 2016 22:12:00
Problema Heapuri Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.3 kb
#include <fstream>
#define Nmax 200001
using namespace std;

char in[] = "heapuri.in";
char out[] = "heapuri.out";

struct heap
{
    int info, index;
};

int n, indice;
heap v[ Nmax ];

void inserare( int x )
{
    int i, aux;
    n ++;
    v[ n ].index = n;
    v[ n ].info = x;
    i = n;

    while ( i > 1 )
    {
        if ( v[ i ].info <= v[ i / 2 ].info )
        {
            aux = v[ i ].info;
            v[ i ].info = v[ i / 2 ].info;
            v[ i / 2 ].info = aux;
            aux = v[ i ].index;
            v[ i ].index = v[ i / 2 ].index;
            v[ i / 2 ].index = aux;
            i = i / 2;
        }
        else i = 1;
    }
}

void stergere( int x )
{
    int i, aux, pos = 0, mijl, st, dr;

    st = 0; dr = n;
    while ( st <= dr )
    {
         mijl = ( st + dr ) / 2;
         if ( v[ mijl ].index == x )
         {
             pos = mijl;
             break;
         }
         else
         {
             if ( x < v[ mijl ].index ) dr = mijl - 1;
             else st = mijl + 1;
         }
     }

     if ( pos )
     {
         aux = v[ n ].info;
         v[ n ].info = v[ pos ].info;
         v[ pos ].info = aux;
         aux = v[ n ].index;
         v[ n ].index = v[ pos ].index;
         v[ pos ].index = aux;

         v[ n ].info = v[ n ].index = 0;
         n--;
         i = pos + 1;
         while ( i > 1 )
         {
            if ( v[ i ].info <= v[ i / 2 ].info )
            {
                aux = v[ i ].info;
                v[ i ].info = v[ i / 2 ].info;
                v[ i / 2 ].info = aux;
                aux = v[ i ].index;
                v[ i ].index = v[ i / 2 ].index;
                v[ i / 2 ].index = aux;
                i = i / 2;
            }
            else i = 1;
         }
     }
}

void run()
{
    int op, val;

    ifstream f (in);
    ofstream g (out);

    f >> indice;

    for ( int i = 1; i <= indice; ++ i )
    {
        f >> op;
        if ( op != 3 )
            f >> val;

        switch ( op )
        {
            case 1: inserare( val );break;
            case 2: stergere( val );break;
            case 3: g << v[ 1 ].info << endl;break;
        }
    }

    f.close();
    g.close();
}

int main()
{
    run();
    return 0;
}