- #include <vector> 
- #include <iostream> 
-   
- typedef std::vector<unsigned int> uint_vector; 
- typedef std::vector<uint_vector> values_vector; 
-   
- values_vector all_values (const uint_vector & ranges, unsigned int pos=0) { 
-    values_vector result; 
-    if (pos == ranges.size()) { 
-       result.push_back (uint_vector()); 
-    }    
-    else { 
-       values_vector rem_result = all_values (ranges, pos+1); 
-       for (unsigned int v = 0; v < ranges[pos]; ++v) { 
-          for (auto it : rem_result) { 
-             result.push_back (uint_vector(1,v)); 
-             result.back().insert (result.back().end(), it.begin(), it.end()); 
-          } 
-       }    
-    }    
-    return result; 
- } 
-   
- void print_values (const values_vector & combos) { 
-    for (auto combo : combos) { 
-       std::cout << "[ "; 
-       for (auto num : combo) { 
-          std::cout << num << ' '; 
-       }    
-       std::cout << "]\n"; 
-    }    
- } 
-   
- int main () { 
-    uint_vector ranges {3,2,2}; 
-    print_values (all_values (ranges)); 
-    return 0; 
- } 
				I2luY2x1ZGUgPHZlY3Rvcj4KI2luY2x1ZGUgPGlvc3RyZWFtPgoKdHlwZWRlZiBzdGQ6OnZlY3Rvcjx1bnNpZ25lZCBpbnQ+IHVpbnRfdmVjdG9yOwp0eXBlZGVmIHN0ZDo6dmVjdG9yPHVpbnRfdmVjdG9yPiB2YWx1ZXNfdmVjdG9yOwoKdmFsdWVzX3ZlY3RvciBhbGxfdmFsdWVzIChjb25zdCB1aW50X3ZlY3RvciAmIHJhbmdlcywgdW5zaWduZWQgaW50IHBvcz0wKSB7CiAgIHZhbHVlc192ZWN0b3IgcmVzdWx0OwogICBpZiAocG9zID09IHJhbmdlcy5zaXplKCkpIHsKICAgICAgcmVzdWx0LnB1c2hfYmFjayAodWludF92ZWN0b3IoKSk7CiAgIH0gICAKICAgZWxzZSB7CiAgICAgIHZhbHVlc192ZWN0b3IgcmVtX3Jlc3VsdCA9IGFsbF92YWx1ZXMgKHJhbmdlcywgcG9zKzEpOwogICAgICBmb3IgKHVuc2lnbmVkIGludCB2ID0gMDsgdiA8IHJhbmdlc1twb3NdOyArK3YpIHsKICAgICAgICAgZm9yIChhdXRvIGl0IDogcmVtX3Jlc3VsdCkgewogICAgICAgICAgICByZXN1bHQucHVzaF9iYWNrICh1aW50X3ZlY3RvcigxLHYpKTsKICAgICAgICAgICAgcmVzdWx0LmJhY2soKS5pbnNlcnQgKHJlc3VsdC5iYWNrKCkuZW5kKCksIGl0LmJlZ2luKCksIGl0LmVuZCgpKTsKICAgICAgICAgfQogICAgICB9ICAgCiAgIH0gICAKICAgcmV0dXJuIHJlc3VsdDsKfQoKdm9pZCBwcmludF92YWx1ZXMgKGNvbnN0IHZhbHVlc192ZWN0b3IgJiBjb21ib3MpIHsKICAgZm9yIChhdXRvIGNvbWJvIDogY29tYm9zKSB7CiAgICAgIHN0ZDo6Y291dCA8PCAiWyAiOwogICAgICBmb3IgKGF1dG8gbnVtIDogY29tYm8pIHsKICAgICAgICAgc3RkOjpjb3V0IDw8IG51bSA8PCAnICc7CiAgICAgIH0gICAKICAgICAgc3RkOjpjb3V0IDw8ICJdXG4iOwogICB9ICAgCn0KCmludCBtYWluICgpIHsKICAgdWludF92ZWN0b3IgcmFuZ2VzIHszLDIsMn07CiAgIHByaW50X3ZhbHVlcyAoYWxsX3ZhbHVlcyAocmFuZ2VzKSk7CiAgIHJldHVybiAwOwp9