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

int RECURSIVE_MIN(int *A, int n) {
    // Base case
    if (n == 1) {
        return A[0];
    }

    int lmin, rmin;

    // Recursive calls in parallel using OpenMP tasks
    #pragma omp task shared(lmin) if (n > 1)
    {
        lmin = RECURSIVE_MIN(A, n / 2);
    }
    
    #pragma omp task shared(rmin) if (n > 1)
    {
        rmin = RECURSIVE_MIN(A + n / 2, n - n / 2);
    }
    
    // Wait for both tasks to complete
    #pragma omp taskwait

    // Return the minimum of the two halves
    return (lmin < rmin) ? lmin : rmin;
}

int main() {
    int A[] = {5, 3, 9, 1, 6, 8, 7, 4, 2};
    int n = sizeof(A) / sizeof(A[0]);
    int min_value;

    // Initialize OpenMP parallel region
    #pragma omp parallel
    {
        #pragma omp single
        {
            min_value = RECURSIVE_MIN(A, n);
        }
    }

    printf("The minimum value is: %d\n", min_value);
    return 0;
}
