#include #include typedef struct dvojice { int poradi; int hodnota; } dvojice; static int int_cmp(const void *p1, const void *p2) { const int *a = (const int *)p1; // casting pointer types const int *b = (const int *)p2; return *a - *b; } static int dvojice_cmp(const void *p1, const void *p2) { const dvojice *a = (const dvojice *)p1; const dvojice *b = (const dvojice *)p2; return a->hodnota - b->hodnota; } int main(void) { // 1. Načteme vstup int N; scanf("%d", &N); int *cisla = malloc(sizeof(int) * N); for (int i = 0; i < N; i++) scanf("%d", &cisla[i]); scanf(" "); // Poznámka: Mezera ve scanf užere bílé znaky ze vstupu navíc char *relace = malloc(sizeof(char) * (N-1)); // Poznámka: fgets načítá o jeden znak méně, než má parametr, tedy N je správně fgets(relace, N, stdin); // 2. Půjdeme postupně podle relací a budeme přiřazovat čísla o 1 větší/menší dvojice *ohodnoceni = malloc(sizeof(dvojice) * N); ohodnoceni[0].poradi = 0; ohodnoceni[0].hodnota = 1; for (int i = 1; i < N; i++) { ohodnoceni[i].poradi = i; if (relace[i-1] == '<') ohodnoceni[i].hodnota = ohodnoceni[i - 1].hodnota + 1; else ohodnoceni[i].hodnota = ohodnoceni[i - 1].hodnota - 1; } // 3. Seřadíme vstup, seřadíme ohodnocení a budeme postupně přiřazovat qsort(cisla, N, sizeof(int), int_cmp); qsort(ohodnoceni, N, sizeof(dvojice), dvojice_cmp); int *vysledek = malloc(sizeof(int) * N); for (int i = 0; i < N; i++) vysledek[ohodnoceni[i].poradi] = cisla[i]; // 4. Vypsání výsledku for (int i = 0; i < N - 1; i++) printf("%d ", vysledek[i]); printf("%d\n", vysledek[N-1]); return 0; }