#include <iostream>
#include <type_traits>
#include <tuple>
#include <array>
using namespace std;
template<typename>
struct TypeTeller;
template<typename T>
void tellType(T t) { (void) TypeTeller<T>(); }
template<typename T>
void tellType() { (void) TypeTeller<T>(); }
template<typename F, typename... Ts>
struct runner
{
F f;
tuple<Ts...> payload;
template<int I>
static auto getRunner()
{
return +[](F& f, tuple<Ts...>& t) -> decltype(auto)
{
return f(std::forward<decltype(get<I>(t))>(get<I>(t)));
};
}
template<int... Ids>
static auto generateRunnersHelper(std::integer_sequence<int, Ids...> is)
{
return std::array<decltype(getRunner<0>()), sizeof...(Ts)>{{ getRunner<Ids>()... }};
}
static auto generateRunners()
{
return generateRunnersHelper(std::make_integer_sequence<int, sizeof...(Ts)>{});
}
decltype(auto) run(int nth)
{
static auto runners = generateRunners();
return runners[nth](f, payload);
}
};
template<typename F, typename... Ts>
runner<F, Ts...> makeRunner(tuple<Ts...> t, F f)
{
return {f, t};
}
int main() {
auto t = make_tuple(42, "Dd", 3.14f);
auto magic = makeRunner(t, [] (auto x) {
cout << x << '\n';
});
int n;
while(cin >> n) magic.run(n);
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dHlwZV90cmFpdHM+CiNpbmNsdWRlIDx0dXBsZT4KI2luY2x1ZGUgPGFycmF5Pgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKdGVtcGxhdGU8dHlwZW5hbWU+CnN0cnVjdCBUeXBlVGVsbGVyOwoKdGVtcGxhdGU8dHlwZW5hbWUgVD4Kdm9pZCB0ZWxsVHlwZShUIHQpIHsgKHZvaWQpIFR5cGVUZWxsZXI8VD4oKTsgfQoKdGVtcGxhdGU8dHlwZW5hbWUgVD4Kdm9pZCB0ZWxsVHlwZSgpIHsgKHZvaWQpIFR5cGVUZWxsZXI8VD4oKTsgfQoKdGVtcGxhdGU8dHlwZW5hbWUgRiwgdHlwZW5hbWUuLi4gVHM+CnN0cnVjdCBydW5uZXIKewoJRiBmOwoJdHVwbGU8VHMuLi4+IHBheWxvYWQ7CgoJdGVtcGxhdGU8aW50IEk+CglzdGF0aWMgYXV0byBnZXRSdW5uZXIoKQoJewoJCXJldHVybiArW10oRiYgZiwgdHVwbGU8VHMuLi4+JiB0KSAtPiBkZWNsdHlwZShhdXRvKQoJCXsKCQkJcmV0dXJuIGYoc3RkOjpmb3J3YXJkPGRlY2x0eXBlKGdldDxJPih0KSk+KGdldDxJPih0KSkpOwoJCX07Cgl9CgkKCXRlbXBsYXRlPGludC4uLiBJZHM+CglzdGF0aWMgYXV0byBnZW5lcmF0ZVJ1bm5lcnNIZWxwZXIoc3RkOjppbnRlZ2VyX3NlcXVlbmNlPGludCwgSWRzLi4uPiBpcykKCXsKCQlyZXR1cm4gc3RkOjphcnJheTxkZWNsdHlwZShnZXRSdW5uZXI8MD4oKSksIHNpemVvZi4uLihUcyk+e3sgZ2V0UnVubmVyPElkcz4oKS4uLiB9fTsKCX0KCglzdGF0aWMgYXV0byBnZW5lcmF0ZVJ1bm5lcnMoKQoJewoJCXJldHVybiBnZW5lcmF0ZVJ1bm5lcnNIZWxwZXIoc3RkOjptYWtlX2ludGVnZXJfc2VxdWVuY2U8aW50LCBzaXplb2YuLi4oVHMpPnt9KTsKCX0KCglkZWNsdHlwZShhdXRvKSBydW4oaW50IG50aCkKCXsKCQlzdGF0aWMgYXV0byBydW5uZXJzID0gZ2VuZXJhdGVSdW5uZXJzKCk7CgkJcmV0dXJuIHJ1bm5lcnNbbnRoXShmLCBwYXlsb2FkKTsKCX0KfTsKCnRlbXBsYXRlPHR5cGVuYW1lIEYsIHR5cGVuYW1lLi4uIFRzPgpydW5uZXI8RiwgVHMuLi4+IG1ha2VSdW5uZXIodHVwbGU8VHMuLi4+IHQsIEYgZikKewoJcmV0dXJuIHtmLCB0fTsKfQoKaW50IG1haW4oKSB7CglhdXRvIHQgPSBtYWtlX3R1cGxlKDQyLCAiRGQiLCAzLjE0Zik7CglhdXRvIG1hZ2ljID0gbWFrZVJ1bm5lcih0LCBbXSAoYXV0byB4KSB7CgkJY291dCA8PCB4IDw8ICdcbic7Cgl9KTsKCglpbnQgbjsKCXdoaWxlKGNpbiA+PiBuKSBtYWdpYy5ydW4obik7IAoJcmV0dXJuIDA7Cn0=