#include <vector>
#include <algorithm>
#include <iostream>
using namespace std;

struct Partition
{
    size_t _size;
    size_t _length;
    vector<size_t> _parts;

    void conjugate()
    {
        size_t space = 0;
        for (size_t i = 0; i < _length; ++i)
            space = max(space, _parts[i] + i);
        ++space;

        _parts.resize(space);
        reverse(begin(_parts), end(_parts));

        auto it_out = begin(_parts);
        auto it_in = end(_parts) - _length;
        size_t prev = 0;

        for (; it_in < end(_parts); ++it_in)
        {
            it_out = fill_n(it_out, *it_in - prev, end(_parts) - it_in);
            prev = *it_in;
        }

        _length = it_out - begin(_parts);
        _parts.resize(_length);
    }

    void print()
    {
        for (auto x: _parts)
            cout << x << ' ';

        cout << '\n';
    }
};

int main()
{
    Partition a {14, 4, {5, 4, 4, 1}};
    a.print();
    a.conjugate();
    a.print();
}
