#include <iostream>
#include <limits>
#include <type_traits>
using namespace std;
template<typename Arr>
auto maxValue(const Arr& a) -> typename remove_all_extents<Arr>::type
{
static_assert(rank<Arr>::value,"[] type only :)");
using T = typename remove_all_extents<Arr>::type;
T res = numeric_limits<T>::min();
if constexpr(rank<Arr>::value == 1)
{
for(int i = 0; i < extent<Arr>::value; ++i)
if (res < a[i]) res = a[i];
}
else
{
for(int i = 0; i < extent<Arr>::value; ++i)
{
T val = maxValue(a[i]);
if (res < val) res = val;
}
}
return res;
}
int main(int argc, char * argv[])
{
int a3[3][2][2] = {
{{1,2},{3,4}},
{{5,6},{7,8}},
{{0,2},{2,4}},
};
int a1[5] = { 1, 5, 2, 9, 7 };
cout << maxValue(a3) << endl;
cout << maxValue(a1) << endl;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8bGltaXRzPgojaW5jbHVkZSA8dHlwZV90cmFpdHM+Cgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKdGVtcGxhdGU8dHlwZW5hbWUgQXJyPgphdXRvIG1heFZhbHVlKGNvbnN0IEFyciYgYSkgLT4gdHlwZW5hbWUgcmVtb3ZlX2FsbF9leHRlbnRzPEFycj46OnR5cGUKewogICAgc3RhdGljX2Fzc2VydChyYW5rPEFycj46OnZhbHVlLCJbXSB0eXBlIG9ubHkgOikiKTsKICAgIHVzaW5nIFQgPSB0eXBlbmFtZSByZW1vdmVfYWxsX2V4dGVudHM8QXJyPjo6dHlwZTsKICAgIFQgcmVzID0gbnVtZXJpY19saW1pdHM8VD46Om1pbigpOwogICAgaWYgY29uc3RleHByKHJhbms8QXJyPjo6dmFsdWUgPT0gMSkKICAgIHsKICAgICAgICBmb3IoaW50IGkgPSAwOyBpIDwgZXh0ZW50PEFycj46OnZhbHVlOyArK2kpCiAgICAgICAgICAgIGlmIChyZXMgPCBhW2ldKSByZXMgPSBhW2ldOwogICAgfQogICAgZWxzZQogICAgewogICAgICAgIGZvcihpbnQgaSA9IDA7IGkgPCBleHRlbnQ8QXJyPjo6dmFsdWU7ICsraSkKICAgICAgICB7CiAgICAgICAgICAgIFQgdmFsID0gbWF4VmFsdWUoYVtpXSk7CiAgICAgICAgICAgIGlmIChyZXMgPCB2YWwpIHJlcyA9IHZhbDsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gcmVzOwp9CgoKaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiBhcmd2W10pCnsKICAgIGludCBhM1szXVsyXVsyXSA9IHsKICAgICAgICB7ezEsMn0sezMsNH19LAogICAgICAgIHt7NSw2fSx7Nyw4fX0sCiAgICAgICAge3swLDJ9LHsyLDR9fSwKICAgIH07CiAgICBpbnQgYTFbNV0gPSB7IDEsIDUsIDIsIDksIDcgfTsKCiAgICBjb3V0IDw8IG1heFZhbHVlKGEzKSA8PCBlbmRsOwogICAgY291dCA8PCBtYXhWYWx1ZShhMSkgPDwgZW5kbDsKfQo=