#include <omp.h>
#include <stdio.h>

int find_min_index(int *A, int start, int n) {
    int min_index = start;
    #pragma omp parallel for shared(A, min_index)
    for (int i = start + 1; i < n; i++) {
        #pragma omp critical
        if (A[i] < A[min_index]) {
            min_index = i;
        }
    }
    return min_index;
}

void recursive_selection_sort(int *A, int start, int n) {
    if (start >= n - 1) return;
    int min_index = find_min_index(A, start, n);
    if (min_index != start) {
        int temp = A[start];
        A[start] = A[min_index];
        A[min_index] = temp;
    }
    #pragma omp task shared(A)
    recursive_selection_sort(A, start + 1, n);
    #pragma omp taskwait
}

int main() {
    int A[] = {64, 25, 12, 22, 11};
    int n = sizeof(A) / sizeof(A[0]);
    #pragma omp parallel
    {
        #pragma omp single
        recursive_selection_sort(A, 0, n);
    }
    for (int i = 0; i < n; i++) {
        printf("%d ", A[i]);
    }
    printf("\n");
    return 0;
}
