#include <iostream>
#include <utility>
#include <iterator>
template<typename C, typename F>
void for_each_flat( C&& c, F&& f );
template<typename C, typename F>
void for_each_flat_helper( C&& c, F&& f, std::true_type /*is_iterable*/ ) {
for( auto&& x : std::forward<C>(c) )
for_each_flat(std::forward<decltype(x)>(x), f);
}
template<typename D, typename F>
void for_each_flat_helper( D&& data, F&& f, std::false_type /*is_iterable*/ ) {
std::forward<F>(f)(std::forward<D>(data));
}
namespace adl_aux {
using std::begin; using std::end;
template<typename C> decltype( begin( std::declval<C>() ) ) adl_begin(C&&);
template<typename C> decltype( end( std::declval<C>() ) ) adl_end(C&&);
}
using adl_aux::adl_begin;
using adl_aux::adl_end;
template<typename> struct type_sink {typedef void type;};
template<typename T> using TypeSink = typename type_sink<T>::type;
template<typename T, typename=void>
struct is_iterable:std::false_type{};
template<typename T>
struct is_iterable<T, TypeSink< decltype( adl_begin( std::declval<T>() ) ) >>:std::true_type{};
template<typename C, typename F>
void for_each_flat( C&& c, F&& f ) {
for_each_flat_helper( std::forward<C>(c), std::forward<F>(f), is_iterable<C>() );
}
int main() {
int x[2][3][4] = {0};
for_each_flat( x, [](int y) { std::cout << y << "\n"; });
// your code goes here
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dXRpbGl0eT4KI2luY2x1ZGUgPGl0ZXJhdG9yPgoKICAgIHRlbXBsYXRlPHR5cGVuYW1lIEMsIHR5cGVuYW1lIEY+CiAgICB2b2lkIGZvcl9lYWNoX2ZsYXQoIEMmJiBjLCBGJiYgZiApOwoKICAgIHRlbXBsYXRlPHR5cGVuYW1lIEMsIHR5cGVuYW1lIEY+CiAgICB2b2lkIGZvcl9lYWNoX2ZsYXRfaGVscGVyKCBDJiYgYywgRiYmIGYsIHN0ZDo6dHJ1ZV90eXBlIC8qaXNfaXRlcmFibGUqLyApIHsKICAgICAgZm9yKCBhdXRvJiYgeCA6IHN0ZDo6Zm9yd2FyZDxDPihjKSApCiAgICAgICAgZm9yX2VhY2hfZmxhdChzdGQ6OmZvcndhcmQ8ZGVjbHR5cGUoeCk+KHgpLCBmKTsKICAgIH0KICAgIHRlbXBsYXRlPHR5cGVuYW1lIEQsIHR5cGVuYW1lIEY+CiAgICB2b2lkIGZvcl9lYWNoX2ZsYXRfaGVscGVyKCBEJiYgZGF0YSwgRiYmIGYsIHN0ZDo6ZmFsc2VfdHlwZSAvKmlzX2l0ZXJhYmxlKi8gKSB7CiAgICAgIHN0ZDo6Zm9yd2FyZDxGPihmKShzdGQ6OmZvcndhcmQ8RD4oZGF0YSkpOwogICAgfQogICAgCiAgICBuYW1lc3BhY2UgYWRsX2F1eCB7CiAgICAgIHVzaW5nIHN0ZDo6YmVnaW47IHVzaW5nIHN0ZDo6ZW5kOwogICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBDPiBkZWNsdHlwZSggYmVnaW4oIHN0ZDo6ZGVjbHZhbDxDPigpICkgKSBhZGxfYmVnaW4oQyYmKTsKICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgQz4gZGVjbHR5cGUoIGVuZCggc3RkOjpkZWNsdmFsPEM+KCkgKSApIGFkbF9lbmQoQyYmKTsKICAgIH0KICAgIHVzaW5nIGFkbF9hdXg6OmFkbF9iZWdpbjsKICAgIHVzaW5nIGFkbF9hdXg6OmFkbF9lbmQ7CgogICAgdGVtcGxhdGU8dHlwZW5hbWU+IHN0cnVjdCB0eXBlX3Npbmsge3R5cGVkZWYgdm9pZCB0eXBlO307CiAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiB1c2luZyBUeXBlU2luayA9IHR5cGVuYW1lIHR5cGVfc2luazxUPjo6dHlwZTsKCiAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZT12b2lkPgogICAgc3RydWN0IGlzX2l0ZXJhYmxlOnN0ZDo6ZmFsc2VfdHlwZXt9OwogICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KICAgIHN0cnVjdCBpc19pdGVyYWJsZTxULCBUeXBlU2luazwgZGVjbHR5cGUoIGFkbF9iZWdpbiggc3RkOjpkZWNsdmFsPFQ+KCkgKSApID4+OnN0ZDo6dHJ1ZV90eXBle307CgogICAgdGVtcGxhdGU8dHlwZW5hbWUgQywgdHlwZW5hbWUgRj4KICAgIHZvaWQgZm9yX2VhY2hfZmxhdCggQyYmIGMsIEYmJiBmICkgewogICAgICBmb3JfZWFjaF9mbGF0X2hlbHBlciggc3RkOjpmb3J3YXJkPEM+KGMpLCBzdGQ6OmZvcndhcmQ8Rj4oZiksIGlzX2l0ZXJhYmxlPEM+KCkgKTsKICAgIH0gICAgICAgIAogICAKICAgCmludCBtYWluKCkgewoJaW50IHhbMl1bM11bNF0gPSB7MH07Cglmb3JfZWFjaF9mbGF0KCB4LCBbXShpbnQgeSkgeyBzdGQ6OmNvdXQgPDwgeSA8PCAiXG4iOyB9KTsKCS8vIHlvdXIgY29kZSBnb2VzIGhlcmUKCXJldHVybiAwOwp9