#include // Úloha 26-Z1-6 Nezbední skřítci (známé pouze výšky skřítků) // Vstup: počet skřítků (N), N řádků s výškou daného skřítka #define MAX_N 100000 int N; // počet skřítků int klicka[MAX_N+1]; // výšky skřítků v klíckách int pomocne_pole[MAX_N+1]; // pomocné pole pro hledání cílové klícky skřítka int binarni_vyhledavani(int zacatek, int konec, int vyska) { int polovina = (zacatek+konec)/2; if (pomocne_pole[polovina] < vyska) // skřítek má být v pravé polovině return binarni_vyhledavani(polovina+1, konec, vyska); else if (pomocne_pole[polovina] > vyska) // skřítek má být v levé polovině return binarni_vyhledavani(zacatek, polovina-1, vyska); else if (pomocne_pole[polovina] == vyska) // našli jsme skřítka return polovina; } int kam_patri_skritek_dane_vysky(int vyska) { return binarni_vyhledavani(1, N+1, vyska); } int docasne_pole_pro_trideni[MAX_N+1]; // pomocné pole, do kterého dvě seřazené části smícháme // merge sort: zacatek je první prvek pole, konec ukazuje těsně za konec (tedy na první neexistující prvek) // podrobnosti v kuchařce http://ksp.mff.cuni.cz/viz/kucharky/trideni void merge_sort(int *pole, int zacatek, int konec) { if (zacatek+1 >= konec) // jednoprvková a menší pole jsou seřazená správně return; int polovina = (zacatek+konec)/2; merge_sort(pole, zacatek, polovina); // seřádí první polovinu pole merge_sort(pole, polovina, konec); // seřadí druhou polovinu pole // obě poloviny sléváme dohromady do pole docasne_pole_pro_trideni: int a=zacatek, b=polovina; // a,b říkají, ze kterých prvků máme vybírat ten menší int i; for (i=zacatek; i