fork download
  1. #include <iostream>
  2. #include <utility>
  3.  
  4. template<unsigned... N> struct seq { typedef seq<N...> type; };
  5.  
  6. template<unsigned k, typename S>
  7. struct seek;
  8.  
  9. template<unsigned N0, unsigned... N>
  10. struct seek< 0, seq<N0, N...> >:
  11. std::integral_constant<unsigned, N0>
  12. {
  13. typedef seq<N...> after;
  14. enum { depth = 1 };
  15. };
  16.  
  17. template<unsigned N0, unsigned N1, unsigned... N>
  18. struct seek< 1, seq<N0, N1, N...> >:
  19. std::integral_constant<unsigned, N1>
  20. {
  21. typedef seq<N...> after;
  22. enum { depth = 1 };
  23. };
  24.  
  25. template<unsigned K, unsigned... N>
  26. struct seek< K, seq<N...> >:
  27. seek< K/2, typename seek< K - K/2-1, seq<N...> >::after >
  28. {
  29. enum {
  30. parent_0 = seek< K - K/2 -1, seq<N...> >::depth,
  31. parent_1 = seek< K/2, typename seek< K-K/2-1, seq<N...> >::after >::depth,
  32. depth = 1 + (parent_0<parent_1?parent_1:parent_0),
  33. };
  34. };
  35.  
  36. typedef seq<1,2,3,4,5> elements;
  37.  
  38. int main() {
  39. std::cout << seek<0, elements>::value << " in " << seek<0, elements>::depth << "steps\n";
  40. std::cout << seek<1, elements>::value << " in " << seek<1, elements>::depth << "steps\n";
  41. std::cout << seek<2, elements>::value << " in " << seek<2, elements>::depth << "steps\n";
  42. std::cout << seek<3, elements>::value << " in " << seek<3, elements>::depth << "steps\n";
  43. std::cout << seek<4, elements>::value << " in " << seek<4, elements>::depth << "steps\n";
  44. // your code goes here
  45. return 0;
  46. }
  47.  
Success #stdin #stdout 0s 3296KB
stdin
Standard input is empty
stdout
1 in 1steps
2 in 1steps
3 in 2steps
4 in 2steps
5 in 3steps