#include <iostream>
#include <omp.h>
#include <cstdlib>
#include <ctime>
#include <climits>
int main() {
const int n = 20;
int arr[n];
// Initialize random array
std::srand(std::time(nullptr));
for (int i = 0; i < n; i++) {
arr[i] = std::rand() % 100; // values from 0 to 99
}
std::cout << "Array: ";
for (int i = 0; i < n; i++) {
std::cout << arr[i] << " ";
}
std::cout << "\n\n";
int minVal = INT_MAX;
int maxVal = INT_MIN;
long long sum = 0;
// Start parallel region
#pragma omp parallel for reduction(min:minVal) reduction(max:maxVal)
reduction(+:sum)
for (int i = 0; i < n; i++) {
if (arr[i] < minVal) minVal = arr[i];
if (arr[i] > maxVal) maxVal = arr[i];
sum += arr[i];
int tid = omp_get_thread_num();
std::cout << "Thread " << tid << " processing element " << arr[i] << "\n";
}
double average = static_cast<double>(sum) / n;
std::cout << "\nResults using Parallel Reduction:\n";
std::cout << "Minimum Value: " << minVal << "\n";
std::cout << "Maximum Value: " << maxVal << "\n";
std::cout << "Sum: " << sum << "\n";
std::cout << "Average: " << average << "\n";
return 0;
}