Pagini recente » Cod sursa (job #705757) | Cod sursa (job #1182506) | Cod sursa (job #1703751) | Cod sursa (job #2836377) | Cod sursa (job #3133151)
#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 std::size_t mod = static_cast<std::size_t>((1ull << 32) - 1);
constexpr std::size_t mul = static_cast<std::size_t>(1664525);
constexpr std::size_t inc = static_cast<std::size_t>(1013904223);
std::size_t stt = 0;
static inline std::size_t _int() {
return (stt = (mul * stt + inc) & mod);
}
constexpr std::size_t nmax = 500005;
std::size_t n, v[nmax];
static inline void isort(const std::size_t& s, const std::size_t& d) {
for(std::size_t i = s + 1, j; i <= d; ++i) {
const std::size_t x = v[i];
for(j = i; j > s && v[j - 1] > x; --j) {
v[j] = v[j - 1];
}
v[j] = x;
}
}
static inline std::size_t partition(const std::size_t& s, const std::size_t& d) {
const std::size_t& pivot = v[d];
std::size_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 sort(const std::size_t& s, const std::size_t& d) {
if(s >= d) return;
const std::size_t pz = s + (_int() % (d - s));
std::swap(v[pz], v[d]);
const std::size_t p = partition(s, d);
sort(s, p - 1);
sort(p + 1, d);
}
static inline void hsort(std::size_t s, std::size_t d) {
for(; s < d; ) {
if(d - s <= 16) {
isort(s, d);
break;
}
const std::size_t pz = s + (_int() % (d - s));
std::swap(v[pz], v[d]);
const std::size_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[2048] = {0};
std::size_t poz = 0;
__attribute__((always_inline)) static inline char read_ch() {
if(++poz == 2048) {
poz = 0;
in.read(static_cast<char*>(buffer), static_cast<std::streamsize>(2048));
}
return buffer[poz];
}
__attribute__((always_inline)) static inline void parse(std::size_t& n) {
char c;
n = 0;
while (!isdigit(c = read_ch()) && c != '-');
std::size_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;
}
int main(void) {
std::ios::sync_with_stdio(false);
in.tie(nullptr);
out.tie(nullptr);
poz = 2047;
parse(n);
for(std::size_t i = 1; i <= n; ++i) parse(v[i]);
hsort(1, n);
for(std::size_t i = 1; i <= n; ++i) out << v[i] << ' ';
in.close();
out.close();
return 0;
}