#include <algorithm>
#include <cmath>
#include <iomanip>
#include <iostream>
#include <iterator>
#include <numeric>
#include <vector>

namespace detail {
template <typename ForwardIterator>
auto mean(ForwardIterator first, ForwardIterator last,
          const std::size_t elements_count) {
  const auto sum_of_elements = std::accumulate(first, last, 0.0);
  return sum_of_elements / elements_count;
}

template <typename ForwardIterator>
auto variance(ForwardIterator first, ForwardIterator last,
              const double elements_mean) {
  auto VarianceAccumulator = [elements_mean](auto total, auto next_value) {
    const auto diff = next_value - elements_mean;
    return total + (diff * diff);
  };
  
  return std::accumulate(first, last, 0.0, VarianceAccumulator);
}
} //namespace

template <typename ForwardIterator>
auto mean(ForwardIterator first, ForwardIterator last) {
  const auto element_count = std::distance(first, last);
  return detail::mean(first, last, element_count);
}

template <typename ForwardIterator>
auto standard_deviation(ForwardIterator first, ForwardIterator last) {
  const auto elements_count = std::distance(first, last);
  const auto elements_mean = detail::mean(first, last, elements_count);
  const auto elements_variance = detail::variance(first, last, elements_mean);

  return std::sqrt(elements_variance / elements_count);
}

template <typename ForwardIterator>
void print_standard_deviation(ForwardIterator first, ForwardIterator last,
                              std::ostream &out) {
  std::copy(first, last, std::ostream_iterator<int>(out, " "));
  out << "\nStandard Deviation: " << std::setprecision(4) << std::fixed
      << standard_deviation(first, last) << '\n' << '\n';
}

int main() {
  std::vector<std::vector<int>> inputs{
      {5, 6, 11, 13, 19, 20, 25, 26, 28, 37},
      {37, 81, 86, 91, 97, 108, 109, 112, 112, 114, 115, 117, 121, 123, 141},
      {266, 344, 375, 399, 409, 433, 436, 440, 449, 476, 502, 504, 530, 584,
       587},
      {809, 816, 833, 849, 851, 961, 976, 1009, 1069, 1125, 1161, 1172, 1178,
       1187, 1208, 1215, 1229, 1241, 1260, 1373}};

  for (const auto &input : inputs) {
    print_standard_deviation(input.begin(), input.end(), std::cout);
  }
}