#include <iostream>
#include <vector>
#include <algorithm>

template <typename IT>
bool nextPartialPerm(IT beg, IT mid, IT end) {
    if (beg == mid) { return false; }
    if (mid == end) { return std::next_permutation(beg, end); }

    auto p1 = mid;
    
    while (p1 != end && *(mid - 1) >= *p1)
        ++p1;
    
    if (p1 != end) {
        std::swap(*p1, *(mid - 1));
        return true;
    } else {
        std::reverse(mid, end);
        auto p3 = make_reverse_iterator(mid);
        
        while (p3 != make_reverse_iterator(beg) && *(p3 - 1) <= *p3)
            ++p3;
        
        if (p3 == make_reverse_iterator(beg)) { std::reverse(beg, end);  return false;}
        
        auto p2 = end - 1;
        
        while (*p2 <= *p3)
            --p2;
        
        std::swap(*p3, *p2);
        std::reverse(p3.base() /*+ 1*/, end);
        return true;
    }
}

int main() {
    std::vector<int> z = {1, 1, 2, 3, 4, 4};
    int m = 3;
    int n = z.size();
    
    do {
        for (int j = 0; j < m; ++j)
            std::cout << z[j] << ' ';
        
        std::cout << std::endl;
    } while (nextPartialPerm(z.begin(), z.begin() + m, z.end()));

    for (int j = 0; j < n; ++j)
        std::cout << z[j] << ' ';
    
    std::cout << std::endl;
}
