#include <iostream>
#include <vector>
#include <functional>
template< class T, class U >
std::vector<U> operator>>=( std::vector<T> val, std::function<std::vector<U>(T)> f )
{
std::vector<U> res;
for( auto x: val )
{
std::vector<U> subs = f( x );
for ( auto y: subs )
{
res.push_back( y );
};
};
return res;
};
std::vector<int> genarray( int n )
{
std::vector<int> res;
for ( int i = 1; i <= n; i++ )
res.push_back( i );
return res;
};
template< class T >
struct mpair
{
T a, b;
mpair( T na, T nb ): a(na), b(nb) {};
};
std::vector<mpair<int>> example( int n )
{
return genarray( n ) >>= std::function<std::vector<mpair<int>>(int)>( [&](int a){ return genarray(a) >>= std::function<std::vector<mpair<int>>(int)>([&](int b) { return std::vector<mpair<int>>{ mpair<int>(a,b), mpair<int>(b,a) }; } ); } );
};
int main()
{
auto r = example( 3 );
for ( auto x: r )
std::cout << "(" << x.a << "," << x.b << ")";
};
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8ZnVuY3Rpb25hbD4KCnRlbXBsYXRlPCBjbGFzcyBULCBjbGFzcyBVID4Kc3RkOjp2ZWN0b3I8VT4gb3BlcmF0b3I+Pj0oIHN0ZDo6dmVjdG9yPFQ+IHZhbCwgc3RkOjpmdW5jdGlvbjxzdGQ6OnZlY3RvcjxVPihUKT4gZiApCnsKCXN0ZDo6dmVjdG9yPFU+IHJlczsKCWZvciggYXV0byB4OiB2YWwgKQoJewoJCXN0ZDo6dmVjdG9yPFU+IHN1YnMgPSBmKCB4ICk7CgkJZm9yICggYXV0byB5OiBzdWJzICkKCQl7CgkJCXJlcy5wdXNoX2JhY2soIHkgKTsKCQl9OwoJfTsKCXJldHVybiByZXM7IAp9OwoKc3RkOjp2ZWN0b3I8aW50PiBnZW5hcnJheSggaW50IG4gKQp7CglzdGQ6OnZlY3RvcjxpbnQ+IHJlczsKCWZvciAoIGludCBpID0gMTsgaSA8PSBuOyBpKysgKQoJCXJlcy5wdXNoX2JhY2soIGkgKTsKCXJldHVybiByZXM7Cn07Cgp0ZW1wbGF0ZTwgY2xhc3MgVCA+CnN0cnVjdCBtcGFpcgp7CglUIGEsIGI7CgltcGFpciggVCBuYSwgVCBuYiApOiBhKG5hKSwgYihuYikge307Cn07CiAgICAgICAgICAgICAgICAKc3RkOjp2ZWN0b3I8bXBhaXI8aW50Pj4gZXhhbXBsZSggaW50IG4gKQp7CglyZXR1cm4gZ2VuYXJyYXkoIG4gKSA+Pj0gc3RkOjpmdW5jdGlvbjxzdGQ6OnZlY3RvcjxtcGFpcjxpbnQ+PihpbnQpPiggWyZdKGludCBhKXsgcmV0dXJuIGdlbmFycmF5KGEpID4+PSBzdGQ6OmZ1bmN0aW9uPHN0ZDo6dmVjdG9yPG1wYWlyPGludD4+KGludCk+KFsmXShpbnQgYikgeyByZXR1cm4gc3RkOjp2ZWN0b3I8bXBhaXI8aW50Pj57IG1wYWlyPGludD4oYSxiKSwgbXBhaXI8aW50PihiLGEpIH07IH0gKTsgfSApOwp9OwoKaW50IG1haW4oKQp7CglhdXRvIHIgPSBleGFtcGxlKCAzICk7Cglmb3IgKCBhdXRvIHg6IHIgKQoJCXN0ZDo6Y291dCA8PCAiKCIgPDwgeC5hIDw8ICIsIiA8PCB4LmIgPDwgIikiOwp9Ow==
(1,1)(1,1)(2,1)(1,2)(2,2)(2,2)(3,1)(1,3)(3,2)(2,3)(3,3)(3,3)