#include <cassert>
#include <iostream>
#include <limits>

/* return the second-largest element of an array
 * of N integer values (must contain at least two values)
 */ 
auto second_of(const int N, const int* const x) {
   assert(N >= 2);
   auto largest = x[0];
   
   // smallest possible int value
   auto second_largest = std::numeric_limits<int>::min();

   for(auto i = 1; i < N; i++)
      if(x[i] > largest) {
         second_largest = largest;
         largest = x[i];
      }
      else if(x[i] > second_largest)
         second_largest = x[i];
   return second_largest;
}

int main() {
   constexpr auto fixed_array_size = 5;
   constexpr int x[fixed_array_size] = {4, 0, 6, 5, 2};
   const auto t = second_of(fixed_array_size, x);
   std::cout << t << "\n";
}

/*
Which of these allowed implicit-type declarations would you actually use in programming practice?
I dont think I would use any of these. Auto takes longer time to write than int and makes the code less readable.
*/
