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

template <typename IT>
bool next_partial_permutation(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 = std::make_reverse_iterator(mid);
 
        while (p3 != std::make_reverse_iterator(beg) && !(*p3 < *(p3 - 1)))
            ++p3;
 
        if (p3 == std::make_reverse_iterator(beg)) {
            std::reverse(beg, end);
            return false;
        }
 
        auto p2 = end - 1;
 
        while (!(*p3 < *p2))
            --p2;
 
        std::swap(*p3, *p2);
        std::reverse(p3.base(), 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 (next_partial_permutation(z.begin(), z.begin() + m, z.end()));

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