Cod sursa(job #2093280)

Utilizator gundorfMoldovan George gundorf Data 23 decembrie 2017 12:33:57
Problema Sortare prin comparare Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.48 kb
#include <iostream>
#include <fstream>
#define Nmax 500005
#define maxim 2147483647
using namespace std;
ifstream fin("algsort.in");
ofstream fout("algsort.out");
int v[Nmax],arbore[2000005],n;
void Citire ()
{
    int i;
    fin>>n;
    for (i=1;i<=n;i++)
        fin>>v[i];
}

void Creare_Arb (int nod,int l,int r)
{
    if (l==r) arbore[nod]=v[l];
    else
    {
        int middle=l+(r-l)/2;
        Creare_Arb(nod*2,l,middle);
        Creare_Arb(nod*2+1,middle+1,r);
        arbore[nod]=min(arbore[2*nod],arbore[2*nod+1]);
    }
}

int  Cautare_Binara (int nod,int l,int r,int x)//caut frunza care contine valoarea x
{
    while (l<=r)
    { int middle=l+(r-l)/2;
        if (l==r&&arbore[nod]==x) return nod; //daca e frunza si e egala cu x, atunci am gasit elementul
        if (arbore[2*nod+1]==x) {nod = 2 * nod + 1 ; l = middle + 1 ; } //altfel mergem pe fiul stang sau drept
        else {nod = nod * 2  ; r = middle;}
    }
}

void actualizare (int poz) //actualizam arborele dupa modificare valorii frunzei cu val minima
{
    arbore[poz/2]=min(arbore[poz/2*2],arbore[poz/2*2+1]);
    if (poz!=1) actualizare(poz/2);
}
int main()
{int i;
    Citire();
    Creare_Arb(1,1,n);
 //fout<<"eti prost ";
    for (i=1;i<=n;i++)
    {
        fout<<arbore[1]<<" "; //afisam minimul din vector
        int poz=Cautare_Binara(1,1,n,arbore[1]);
        arbore[poz]=maxim; //eliminam minimul
        actualizare(poz);//actualizam minimul
    }

    return 0;
}