#include <cstdio>

#include <algorithm>

constexpr int INT_MIN() {
  return (1 << ((sizeof(int) << 3) - 1));
}

inline int accumulate(int *current, int next) {
  int ret = (*current) * next;
  if (next == 0) {
    *current = 1;
  } else {
    *current = ret;
  }
  return ret;
}

template<size_t N_>
int calculate(int (&a)[N_]) {
  int m = INT_MIN(), litr = 1, ritr = 1;
  for (size_t i = 0; i < N_; ++i) {
    m = std::max({
        m, accumulate(&litr, a[i]), accumulate(&ritr, a[N_ - i - 1])
    });
  }
  return m;
}

int main() {
  int a[] = {
      2, -7, 0, 2, 3, 8, -6, 5
  };
  printf("%d\n", calculate(a));
  int b[] = {
      -2, 0, 3, 5, -7
  };
  printf("%d\n", calculate(b));
  int c[] = {
      -2, 10, 10, -2
  };
  printf("%d\n", calculate(c));
  return 0;
}