#include <vector>
#include <iostream>
#include <memory>
class huffman_node
{
public:
        bool internal_;
        char symbol_;
        int freq_;
        std::unique_ptr<huffman_node> left_;
        std::unique_ptr<huffman_node> right_;
public:
        huffman_node() : internal_(true), symbol_('?') {}
        huffman_node(char symb, int freq): internal_(false),
                                           symbol_(symb),
                                           freq_(freq) {}
        huffman_node(huffman_node& other)
        {
                internal_ = other.internal_;
                symbol_ = other.symbol_;
                freq_ = other.freq_;
                left_ = std::move(other.left_);
                right_ = std::move(other.right_);
        }
        huffman_node & operator=(huffman_node& other)
        {
                internal_ = other.internal_;
                symbol_ = other.symbol_;
                freq_ = other.freq_;
                left_ = std::move(other.left_);
                right_ = std::move(other.right_);
                return *this;
        }
        ~huffman_node() {}
};
 
class huffman_encoder
{
public:
        void make_huffman(
                const std::vector<int>& freq,
                const std::vector<char>& symb)
        {
                std::vector<std::unique_ptr<huffman_node>> nodes;
                for (int i = 0; i < freq.size(); ++i)
                {
                        std::unique_ptr<huffman_node> ph(new huffman_node(symb[i], freq[i]));
                        if (ph)
                                nodes.push_back(std::move(ph));
                }
                print_node(nodes);
        }
 
        void print_node(std::vector<std::unique_ptr<huffman_node>>& nodes)
        {
                for (int i = 0; i < nodes.size(); ++i)
                {
                        std::unique_ptr<huffman_node> p = std::move(nodes[i]);
                        std::cout << "symbol: " << p->symbol_ << " frequency: " << p->freq_ << std::endl;
                        nodes[i] = std::move(p);
                }
        }
};
 
int main()
{
        std::vector<char> sym = {'a', 'b', 'c', 'd'};
        std::vector<int> freq = { 5,   1,   3,   9};
        huffman_encoder he;
        he.make_huffman(freq, sym);
        return 0;
}
				I2luY2x1ZGUgPHZlY3Rvcj4KI2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8bWVtb3J5PgpjbGFzcyBodWZmbWFuX25vZGUKewpwdWJsaWM6CiAgICAgICAgYm9vbCBpbnRlcm5hbF87CiAgICAgICAgY2hhciBzeW1ib2xfOwogICAgICAgIGludCBmcmVxXzsKICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8aHVmZm1hbl9ub2RlPiBsZWZ0XzsKICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8aHVmZm1hbl9ub2RlPiByaWdodF87CnB1YmxpYzoKICAgICAgICBodWZmbWFuX25vZGUoKSA6IGludGVybmFsXyh0cnVlKSwgc3ltYm9sXygnPycpIHt9CiAgICAgICAgaHVmZm1hbl9ub2RlKGNoYXIgc3ltYiwgaW50IGZyZXEpOiBpbnRlcm5hbF8oZmFsc2UpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ltYm9sXyhzeW1iKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyZXFfKGZyZXEpIHt9CiAgICAgICAgaHVmZm1hbl9ub2RlKGh1ZmZtYW5fbm9kZSYgb3RoZXIpCiAgICAgICAgewogICAgICAgICAgICAgICAgaW50ZXJuYWxfID0gb3RoZXIuaW50ZXJuYWxfOwogICAgICAgICAgICAgICAgc3ltYm9sXyA9IG90aGVyLnN5bWJvbF87CiAgICAgICAgICAgICAgICBmcmVxXyA9IG90aGVyLmZyZXFfOwogICAgICAgICAgICAgICAgbGVmdF8gPSBzdGQ6Om1vdmUob3RoZXIubGVmdF8pOwogICAgICAgICAgICAgICAgcmlnaHRfID0gc3RkOjptb3ZlKG90aGVyLnJpZ2h0Xyk7CiAgICAgICAgfQogICAgICAgIGh1ZmZtYW5fbm9kZSAmIG9wZXJhdG9yPShodWZmbWFuX25vZGUmIG90aGVyKQogICAgICAgIHsKICAgICAgICAgICAgICAgIGludGVybmFsXyA9IG90aGVyLmludGVybmFsXzsKICAgICAgICAgICAgICAgIHN5bWJvbF8gPSBvdGhlci5zeW1ib2xfOwogICAgICAgICAgICAgICAgZnJlcV8gPSBvdGhlci5mcmVxXzsKICAgICAgICAgICAgICAgIGxlZnRfID0gc3RkOjptb3ZlKG90aGVyLmxlZnRfKTsKICAgICAgICAgICAgICAgIHJpZ2h0XyA9IHN0ZDo6bW92ZShvdGhlci5yaWdodF8pOwogICAgICAgICAgICAgICAgcmV0dXJuICp0aGlzOwogICAgICAgIH0KICAgICAgICB+aHVmZm1hbl9ub2RlKCkge30KfTsKCmNsYXNzIGh1ZmZtYW5fZW5jb2Rlcgp7CnB1YmxpYzoKICAgICAgICB2b2lkIG1ha2VfaHVmZm1hbigKICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGludD4mIGZyZXEsCiAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxjaGFyPiYgc3ltYikKICAgICAgICB7CiAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8aHVmZm1hbl9ub2RlPj4gbm9kZXM7CiAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZyZXEuc2l6ZSgpOyArK2kpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxodWZmbWFuX25vZGU+IHBoKG5ldyBodWZmbWFuX25vZGUoc3ltYltpXSwgZnJlcVtpXSkpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAocGgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZXMucHVzaF9iYWNrKHN0ZDo6bW92ZShwaCkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcHJpbnRfbm9kZShub2Rlcyk7CiAgICAgICAgfQoKICAgICAgICB2b2lkIHByaW50X25vZGUoc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPGh1ZmZtYW5fbm9kZT4+JiBub2RlcykKICAgICAgICB7CiAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG5vZGVzLnNpemUoKTsgKytpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8aHVmZm1hbl9ub2RlPiBwID0gc3RkOjptb3ZlKG5vZGVzW2ldKTsKICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpjb3V0IDw8ICJzeW1ib2w6ICIgPDwgcC0+c3ltYm9sXyA8PCAiIGZyZXF1ZW5jeTogIiA8PCBwLT5mcmVxXyA8PCBzdGQ6OmVuZGw7CiAgICAgICAgICAgICAgICAgICAgICAgIG5vZGVzW2ldID0gc3RkOjptb3ZlKHApOwogICAgICAgICAgICAgICAgfQogICAgICAgIH0KfTsKCmludCBtYWluKCkKewogICAgICAgIHN0ZDo6dmVjdG9yPGNoYXI+IHN5bSA9IHsnYScsICdiJywgJ2MnLCAnZCd9OwogICAgICAgIHN0ZDo6dmVjdG9yPGludD4gZnJlcSA9IHsgNSwgICAxLCAgIDMsICAgOX07CiAgICAgICAgaHVmZm1hbl9lbmNvZGVyIGhlOwogICAgICAgIGhlLm1ha2VfaHVmZm1hbihmcmVxLCBzeW0pOwogICAgICAgIHJldHVybiAwOwp9