#include #include #define MAX 1000 long ok[MAX], bad[MAX], res[MAX]; void merge(long *x, long nx, long *y, long ny, long *z) { /* Slévání dvou setříděných posloupností */ while (nx || ny) { if (!ny || (nx && *x < *y)) *z++ = *x++, nx--; else *z++ = *y++, ny--; } } void mergesort(long *x, long n) { /* Třidění MergeSortem */ long h = n/2; if (!h) return; mergesort(x, h); mergesort(x+h, n-h); merge(x, h, x+h, n-h, res); /* res použijeme jako pomocné pole */ memcpy(x, res, n*sizeof(x[0])); } int main(void) { long N, i, x; long nok=0, nbad=0; scanf("%ld", &N); /* Popelka přebírá hrách\dots */ for (i=0; i ok[nok-1]) /* Nový prvek vypadá správně */ ok[nok++] = x; else { /* Pokles $\Rightarrow$ pryč s~oběma */ bad[nbad++] = ok[--nok]; bad[nbad++] = x; } } mergesort(bad, nbad); /* Setřídíme špatné */ merge(bad, nbad, ok, nok, res); /* Přilijeme dobré */ for (i=0; i