Pagini recente » Cod sursa (job #322990) | Cod sursa (job #1758672) | Cod sursa (job #2172680) | Cod sursa (job #2269986) | Cod sursa (job #2222447)
#include <cstdio>
#include <algorithm>
__attribute__((always_inline)) void CountingSort(size_t N, size_t A[], size_t B[], size_t digit)
{
size_t frequence[0x800]{}, index[0x800]; index[0x0] = ~0x0;
for(size_t i = N; i; ++frequence[A[--i] >> digit & 0x7FF]);
for(size_t i = 0x0; i != 0x7FF; index[++i] = index[~-i] + frequence[~-i]);
for(size_t i = 0x0; i != N; ++i) B[++index[A[i] >> digit & 0x7FF]] = A[i];
}
#define BUFFER_SIZE 7500000
char buffer[BUFFER_SIZE], *head = buffer, *writeHead = buffer;
bool isDigit[0xFF];
void parse()
{
buffer[fread(buffer, 0x1, BUFFER_SIZE, stdin)] = 0x0;
for(int i = 0x2F; i < 0x3A; ++i) isDigit[i] = 0x1;
}
__attribute__((always_inline)) int get_int()
{
int number = 0x0;
for(; !isDigit[*head]; ++head);
for(; isDigit[*head]; ++head)
number = number * 0xA + (*head) - 0x30;
return number;
}
__attribute__((always_inline)) void put_int(int x)
{
if(x == 0x0)
{
*(writeHead++) = 0x30; *(writeHead++) = 0x20;
return;
}
if(x < 0x0)
{
*(writeHead++) = 0x2D; *(writeHead++) = 0x31; *(writeHead++) = 0x20;
return;
}
char *old = writeHead;
while(x)
{
*(writeHead++) = x % 0xA + 0x30;
x /= 0xA;
}
std::reverse(old, writeHead);
*(writeHead++) = 0x20;
}
int main()
{
freopen("algsort.in", "r", stdin);
freopen("algsort.out", "w", stdout);
parse();
size_t N, v[0x80000], w[0x80000]; ///declara vectorii global daca iei (0xC00000FD)
N = get_int();
for(size_t i = N; --i;)
{
v[i] = get_int();
}
v[0x0] = get_int();
CountingSort(N, v, w, 0x0);
CountingSort(N, w, v, 0xB);
CountingSort(N, v, w, 0x16);
for(size_t i = 0x0; i != N; ++i)
{
put_int(w[i]);
}
fwrite(buffer, 0x1, writeHead - buffer, stdout);
return 0x0;
}