Cod sursa(job #3133168)

Utilizator zzzzzZazaazaza zzzzz Data 25 mai 2023 11:17:43
Problema Sortare prin comparare Scor 80
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 3.12 kb
#pragma GCC optimize("O2")

#include <iostream>
#include <fstream>

std::ifstream in(static_cast<const char*>("algsort.in"));
std::ofstream out(static_cast<const char*>("algsort.out"));

constexpr uint32_t mod = static_cast<uint32_t>((1ull << 32) - 1);
constexpr uint32_t mul = static_cast<uint32_t>(1664525);
constexpr uint32_t inc = static_cast<uint32_t>(1013904223);
uint32_t stt = 0;

static inline uint32_t _int() {
    return (stt = (mul * stt + inc) & mod);
}

constexpr uint32_t nmax = 500005;

uint32_t n, v[nmax];

static inline void isort(const uint32_t& s, const uint32_t& d) {
    for(uint32_t i = s + 1, j; i <= d; ++i) {
        const uint32_t x = v[i];
        for(j = i; j > s && v[j - 1] > x; --j) {
            v[j] = v[j - 1];
        }
        v[j] = x;
    }
}

static inline uint32_t partition(const uint32_t& s, const uint32_t& d) {
    const uint32_t& pivot = v[d];
    uint32_t i = s - 1, j;
    for(j = s; j < d; ++j) {
        if(v[j] < pivot) {
            ++i; std::swap(v[i], v[j]);
        }
    }
    std::swap(v[i + 1], v[d]);
    return i + 1;
}

static inline void hsort(uint32_t s, uint32_t d) {
    for(; s < d; ) {
        if(d - s < 16) {
            isort(s, d);
            break;
        }

        const uint32_t pz = s + (_int() % (d - s));
        std::swap(v[pz], v[d]);
        const uint32_t& p = partition(s, d);

        if(p - s < d - p) {
            hsort(s, p - 1);
            s = p + 1;
        } else {
            hsort(p + 1, d);
            d = p - 1;
        }
    }
}

char buffer[4096] = {0}, obuffer[65536] = {0};
uint32_t poz = 0, opoz = 0;

__attribute__((always_inline)) static inline char& read_ch() {
    if(++poz == 4096) {
        poz = 0;
        in.read(static_cast<char*>(buffer), static_cast<std::streamsize>(4096));
    }

    return buffer[poz];
}

__attribute__((always_inline)) static inline void write_ch(const char& ch) {
    if(opoz == 65536) {
        out.write(static_cast<const char*>(obuffer), static_cast<std::streamsize>(65536));
        opoz = 0;
        obuffer[opoz++] = ch;
    } else {
        obuffer[opoz++] = ch;
    }
}

__attribute__((always_inline)) static inline void parse(uint32_t& n) {
    char c;
    n = 0;
    while (!isdigit(c = read_ch()) && c != '-');
    uint32_t sgn = 1;
    if (c == '-') {
        n = 0;
        sgn = -1;
    } else {
        n = c - '0';
    }
    while (isdigit(c = read_ch())) {
        n = 10 * n + c - '0';
    }
    n *= sgn;
}

static void parseout(const uint32_t& n) {
    if (n <= 9) {
        write_ch(n + '0');
    } else {
        parseout(n / 10);
        write_ch(n % 10 + '0');
    }
}

int main(void) {
    std::ios::sync_with_stdio(false);
    in.tie(nullptr);
    out.tie(nullptr);

    poz = 4095;

    parse(n);
    for(uint32_t i = 1; i <= n; ++i) parse(v[i]);
    hsort(1, n);
    for(uint32_t i = 1; i <= n; ++i) {
        parseout(v[i]);
        write_ch(' ');
    }

    out.write(static_cast<const char*>(obuffer), static_cast<std::streamsize>(opoz));

    in.close();
    out.close();
    return 0;
}