#include #include #define MAX 100000 #define najdi_frekvenci(x) nf(x, 0, maxF) int N; int maxF = -1; // Maximální zatím udělená frekvence int frekvence[MAX]; // Pomocné pole na frekvence (indexováno od 0), setříděné sestupně int projektory[MAX]; // Pro každý obraz uloženo číslo projektoru int nf(int co, int min, int max) { // Půlení intervalu [min, max]. // Hledáme nejmenší takové i, pro které frekvence[i] < co. // // Pokud je interval prázdný if (min > max) return min; // Jednoprvkový interval if (min == max) { if (frekvence[min] < co) return min; else return min+1; } // Střed intervalu int stred = (min + max)/2; // Frekvence ve středu je přijatelná if (frekvence[stred] < co) return nf(co, min, stred); if (frekvence[stred] > co) return nf(co, stred+1, max); fprintf(stderr, "Cosi mi pošlapalo paměť, asi růžový slon, sem to přece nemůže dojít!\n"); abort(); } int main(void) { // Přečteme vstup scanf("%d", &N); for (int i=0;i= maxF) maxF++; // Uložíme informaci o přidělení frekvence[f] = projektory[i]; // A vypíšeme (číslo a za ním mezeru; leda bychom byli u posledního čísla, to bude nový řádek místo mezery) // Frekvence budeme také indexovat na výstupu od 1. printf("%d%c", f+1, (i+1 == N) ? '\n' : ' '); } }