#include <iostream>
#include <vector>
typedef std::vector<unsigned> arguments;
typedef unsigned nat;
template<typename F, typename... G>
struct S {
static nat apply(arguments const & args) {
arguments output = { G::apply(args)... };
return F::apply(output);
}
template<typename... T>
static nat apl(T... x) {
arguments args = { static_cast<nat>(x)... };
return apply(args);
}
};
template<nat N, nat M>
struct U {
static nat apply(arguments const & args) {
return args[M - 1];
}
template<typename... T>
static nat apl(T... x) {
arguments args = { static_cast<nat>(x)... };
return apply(args);
}
};
struct N {
static nat apply(arguments const & v) {
return v[0] + 1;
}
template<typename... T>
static nat apl(T... x) {
arguments args = { static_cast<nat>(x)... };
return apply(args);
}
};
int main() {
std::cout << S<N, U<2, 1> >::apl(5, 3) << std::endl;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgoKdHlwZWRlZiBzdGQ6OnZlY3Rvcjx1bnNpZ25lZD4gYXJndW1lbnRzOwp0eXBlZGVmIHVuc2lnbmVkIG5hdDsKCnRlbXBsYXRlPHR5cGVuYW1lIEYsIHR5cGVuYW1lLi4uIEc+CnN0cnVjdCBTIHsKCglzdGF0aWMgbmF0IGFwcGx5KGFyZ3VtZW50cyBjb25zdCAmIGFyZ3MpIHsKCQlhcmd1bWVudHMgb3V0cHV0ID0geyBHOjphcHBseShhcmdzKS4uLiB9OwoJCXJldHVybiBGOjphcHBseShvdXRwdXQpOwoJfQoKCXRlbXBsYXRlPHR5cGVuYW1lLi4uIFQ+CglzdGF0aWMgbmF0IGFwbChULi4uIHgpIHsKCQlhcmd1bWVudHMgYXJncyA9IHsgc3RhdGljX2Nhc3Q8bmF0Pih4KS4uLiB9OwoJCXJldHVybiBhcHBseShhcmdzKTsKCX0KfTsKCnRlbXBsYXRlPG5hdCBOLCBuYXQgTT4Kc3RydWN0IFUgewoKCXN0YXRpYyBuYXQgYXBwbHkoYXJndW1lbnRzIGNvbnN0ICYgYXJncykgewoJCXJldHVybiBhcmdzW00gLSAxXTsKCX0KCgl0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBUPgoJc3RhdGljIG5hdCBhcGwoVC4uLiB4KSB7CgkJYXJndW1lbnRzIGFyZ3MgPSB7IHN0YXRpY19jYXN0PG5hdD4oeCkuLi4gfTsKCQlyZXR1cm4gYXBwbHkoYXJncyk7Cgl9Cn07CgpzdHJ1Y3QgTiB7CgogICAgc3RhdGljIG5hdCBhcHBseShhcmd1bWVudHMgY29uc3QgJiB2KSB7CiAgICAgICAgcmV0dXJuIHZbMF0gKyAxOwogICAgfQoKICAgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIFQ+CiAgICBzdGF0aWMgbmF0IGFwbChULi4uIHgpIHsKICAgIAlhcmd1bWVudHMgYXJncyA9IHsgc3RhdGljX2Nhc3Q8bmF0Pih4KS4uLiB9OwogICAgICAgIHJldHVybiBhcHBseShhcmdzKTsKICAgIH0KfTsKCmludCBtYWluKCkgewoJc3RkOjpjb3V0IDw8IFM8TiwgVTwyLCAxPiA+OjphcGwoNSwgMykgPDwgc3RkOjplbmRsOwoJcmV0dXJuIDA7Cn0=