Pagini recente » Cod sursa (job #206902) | Cod sursa (job #831167) | Cod sursa (job #1226581) | Cod sursa (job #2564560) | Cod sursa (job #2093280)
#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;
}