Cod sursa(job #1785771)

Utilizator SlevySlevoaca Stefan-Gabriel Slevy Data 21 octombrie 2016 22:25:50
Problema Sortare prin comparare Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.87 kb
#include <iostream>
#include <fstream>
#include <cmath>
#include <algorithm>
#define NMAX 500001
#define SMAX 800
#define INF ((1LL << 32) - 3)

using namespace std;

ifstream in("algsort.in");
ofstream out("algsort.out");
unsigned int A[NMAX], n;
unsigned int A_MIN[SMAX], dx[SMAX], dy[SMAX];
char BUFF[NMAX];
unsigned int pos = 0;

void Read(unsigned int &a)
{
    while(!isdigit(BUFF[pos]))
        if(++pos == NMAX)
            in.read(BUFF,NMAX), pos = 0;
    a = 0;
    while(isdigit(BUFF[pos]))
    {
        a = a * 10 + (BUFF[pos] - '0');
        if(++pos == NMAX)
            in.read(BUFF,NMAX), pos = 0;
    }
}

int main()
{
    Read(n);
    for (unsigned int i = 1; i <= n; ++i)
        Read(A[i]);
    in.close();
    unsigned int piece, length = sqrt(n);
    unsigned int L = n / length;
    if ((double) L < (1.0 * n) / length)
        L++;
    for (unsigned int i = 0; i < L - 1; ++i)
    {
        A_MIN[i] = INF;
        dx[i] = i * length + 1;
        dy[i] = dx[i] + length - 1;
    }
    A_MIN[L - 1] = INF;
    dx[L - 1] = (L - 1) * length + 1;
    dy[L - 1] = n;
    for (unsigned int i = 1; i <= n; ++i)
    {
        piece = (i - 1) / length;
        A_MIN[piece] = min(A_MIN[piece], A[i]);
    }
    unsigned int minn, p;
    for (unsigned int j = 1; j <= n; ++j)
    {
        minn = INF, p = 0;
        for (unsigned int i = 0; i < L; ++i)
            if (minn > A_MIN[i])
            {
                minn = A_MIN[i];
                p = i;
            }
        out << minn << " ";
        for (unsigned int i = dx[p]; i <= dy[p]; ++i)
            if (A[i] == minn)
            {
                A[i] = INF;
                break;
            }
        A_MIN[p] = INF;
        for (unsigned int i = dx[p]; i <= dy[p]; ++i)
            A_MIN[p] = min(A_MIN[p],A[i]);
    }
    out.close();
    return 0;
}