#include <stddef.h>
#include <stdio.h>
#include <math.h>

#define countof(array) (sizeof(array) / sizeof((array)[0]))

static void calculate(const double *array, size_t length) {
    double sum_of_negatives = 0.0;

    // Текущие минимум и максимум, такие, чтобы первая же итерация заполнила
    // их реальными значениями.
    double minimum = +HUGE_VAL;
    double maximum = -HUGE_VAL;

    // Текущее частичное и предполагаемое решения для ситуации, когда
    // минимальный элемент предшествует максимальному: min (...) max.
    double minfirst_running = 0.0, minfirst_solution = 1.0;

    // Текущее частичное и предполагаемое решения для: max (...) min.
    double maxfirst_running = 0.0, maxfirst_solution = 1.0;

    for (size_t i = 0; i < length; i++) {
        double value = array[i];
        
        // Суммируем отрицательные числа.
        if (value < 0.0) {
            sum_of_negatives += value;
        }

        // Эти временные переменные нужны, чтобы избежать дополнительных
        // условий из-за взаимных зависимостей между двумя условиями ниже.
        double minfirst_current = minfirst_running;
        double maxfirst_current = maxfirst_running;
        
        minfirst_running *= value;
        maxfirst_running *= value;

        if (value > maximum) {
            // Если мы нашли новый максимум, запоминаем текущее произведение,
            // как решение для min (...) max, а решение для max (...) min
            // становится неверным, т.к., считалось с неправильного максимума.
            maximum = value;
            maxfirst_solution = maxfirst_running = maxfirst_current = 1.0;
            minfirst_solution = minfirst_current;
        }

        if (value < minimum) {
            // Нашли новый минимум. Та же хуйня, что и с максимумом, только
            // переменные другие.
            minimum = value;
            minfirst_running = minfirst_solution = 1.0;
            maxfirst_solution = maxfirst_current;
        }
    }

    // Если между min и max нет элементов, произведение будет равно 1.
    double product = (minfirst_solution != 1.0) ?
        minfirst_solution : maxfirst_solution;
    
    printf("Сумма отрицательных элементов: %g\n", sum_of_negatives);
    printf("Произведение между мин. и макс. элементами: %g\n", product);
}

int main(void)
{
    double array1[] = { 6, 2, 3, 4, 5, -1, -5 };
    calculate(array1, countof(array1));
    
    double array2[] = { -2, 2, 3, 4, -1, 8, 2 };
    calculate(array2, countof(array2));
}
