#include #include #include #include int main(int argc, char **argv) { if (argc == 2) { uint64_t count = strtoull(argv[1], NULL, 10); int16_t *terms = calloc(count, sizeof(*terms)); int64_t d[65536]; memset(d, 0, sizeof(d)); int64_t *dist = (d + 32768); uint64_t inversions = 0; uint64_t possible_inversions = 0; uint64_t greater = 0; for (uint64_t i = 1; i < count; i++) { dist[terms[i-1]] += 1; possible_inversions += (i - 1); uint64_t double_inversions = inversions * 2; if (double_inversions < possible_inversions) { terms[i] = terms[i-1] - 1; greater += dist[terms[i-1]]; } else if (double_inversions > possible_inversions) { terms[i] = terms[i-1] + 1; greater -= dist[terms[i]]; } else { terms[i] = terms[i-1]; } inversions += greater; } printf("0"); for (uint64_t i = 1; i < count; i++) { printf(", %d", terms[i]); } free(terms); } printf("\n"); return 0; }