#include <iostream>
#include <cstddef>
#include <utility>
#include <array>

template <typename T, std::size_t N, typename... Ts>
constexpr std::array<T, N> permute(const std::array<T, N>& arr, const std::array<int, N>& permutation, Ts&&... processed)
{
	return (sizeof...(Ts) == N) ?
		std::array<T, N>{ std::forward<Ts>(processed)... } :
		permute(arr, permutation, std::forward<Ts>(processed)..., arr[permutation[sizeof...(Ts)]]);
}

int main()
{
	constexpr std::array<int, 3> arr{1, 2, 3};
	constexpr std::array<int, 3> permutation{2, 1, 0};
	constexpr auto result = permute(arr, permutation);
	
	for (const auto& x : result)
		std::cout << x << std::endl;

	return 0;
}