Pagini recente » Cod sursa (job #1722192) | Cod sursa (job #2396046) | Cod sursa (job #2325968) | Cod sursa (job #1467366) | Cod sursa (job #1028091)
#include <iostream>
#include <fstream>
#include <math.h>
std::ifstream fin("algsort.in");
std::ofstream fout("algsort.out");
long long n, k, lung, vec[500001];
long long minimi[500001];
void citire()
{
fin>>n;
k = sqrt(n);
lung = 5;//n / k;
k = n / lung;
unsigned int maxim = -1;
for(int i = 0; i <= (n-1) / lung; i++)
{
minimi[i] = maxim;
}
for(int i = 0; i < n; i++)
{
fin>>vec[i];
// std::cout<<maxim<<' '<<i/lung<<minimi[i/lung]<<'\n';
if(minimi[i / lung] > vec[i])
{
minimi[i / lung] = vec[i];
// std::cout<<i/lung<<' '<<vec[i]<<'\n';
}
}
// std::cout<<n<<' '<<lung<<'\n';
// for(int i = 0; i <= (n-1)/lung; i++)
// {
// std::cout<<minimi[i]<<' ';
// }
// std::cout<<'\n';
}
void rezolvare()
{
bool done = false;
unsigned int myMin = -1;
int poz = 0;
for(int i = 0; i <= (n-1)/lung; i++)
{
if(minimi[i] != -1)
{
if(minimi[i] < myMin)
{
myMin = minimi[i];
done = true;
poz = i;
}
}
}
if(done)
{
//minimi[poz] = -1;
unsigned int myNewMin = -1;
bool found = false, changed = false;
for(int i = poz * lung; i < (poz+1) * lung && i < n; i++)
{
if(!changed && vec[i] == myMin)
{
vec[i] = -1;
changed = true;
}
if(vec[i] != -1 && vec[i] < myNewMin)
{
found = true;
myNewMin = vec[i];
}
}
if(found)
{
minimi[poz] = myNewMin;
}
else
{
minimi[poz] = -1;
}
for(int i = 0; i <= (n-1)/lung; i++)
{
// std::cout<<minimi[i]<<' ';
}
// std::cout<<'\n';
fout<<myMin<<' ';
rezolvare();
}
}
int main()
{
citire();
rezolvare();
return 0;
}