#include <algorithm>
#include <iterator>
#include <iostream>
#include <ostream>
#include <vector>
using namespace std;
using HanoiPin = vector<unsigned>;
template<class PostAction>
void move_hanoi
(
HanoiPin &from, HanoiPin &to, HanoiPin &temp,
size_t count, PostAction post
)
{
if(count>1)
{
move_hanoi(from, temp, to, count-1, post);
move_hanoi(from, to, temp, 1, post);
move_hanoi(temp, to, from, count-1, post);
}
else
{
to.push_back(from.back());
from.pop_back();
post();
}
}
int main()
{
auto count=1000000;
HanoiPin a,b,c;
generate_n(back_inserter(a), count, [=]() mutable
{
return count--;
});
auto print_hanoi=[](HanoiPin &h)
{
cout << "|";
for(auto x : h)
cout << x << "-";
cout << endl;
};
auto printer=[&]
{
//print_hanoi(a);
//print_hanoi(b);
//print_hanoi(c);
static auto cnt = 0;
cout << "Move #" << (cnt++) << endl;
};
printer();
move_hanoi(a,b,c,a.size(),printer);
}
I2luY2x1ZGUgPGFsZ29yaXRobT4KI2luY2x1ZGUgPGl0ZXJhdG9yPgojaW5jbHVkZSA8aW9zdHJlYW0+CiNpbmNsdWRlIDxvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKdXNpbmcgSGFub2lQaW4gPSB2ZWN0b3I8dW5zaWduZWQ+OwoKdGVtcGxhdGU8Y2xhc3MgUG9zdEFjdGlvbj4Kdm9pZCBtb3ZlX2hhbm9pCigKICAgIEhhbm9pUGluICZmcm9tLCBIYW5vaVBpbiAmdG8sIEhhbm9pUGluICZ0ZW1wLAogICAgc2l6ZV90IGNvdW50LCBQb3N0QWN0aW9uIHBvc3QKKQp7CiAgICBpZihjb3VudD4xKQogICAgewogICAgICAgIG1vdmVfaGFub2koZnJvbSwgdGVtcCwgdG8sIGNvdW50LTEsIHBvc3QpOwogICAgICAgIG1vdmVfaGFub2koZnJvbSwgdG8sIHRlbXAsIDEsIHBvc3QpOwogICAgICAgIG1vdmVfaGFub2kodGVtcCwgdG8sIGZyb20sIGNvdW50LTEsIHBvc3QpOwogICAgfQogICAgZWxzZQogICAgewogICAgICAgIHRvLnB1c2hfYmFjayhmcm9tLmJhY2soKSk7CiAgICAgICAgZnJvbS5wb3BfYmFjaygpOwogICAgICAgIHBvc3QoKTsKICAgIH0KfQoKaW50IG1haW4oKQp7CiAgICBhdXRvIGNvdW50PTEwMDAwMDA7CiAgICBIYW5vaVBpbiBhLGIsYzsKICAgIGdlbmVyYXRlX24oYmFja19pbnNlcnRlcihhKSwgY291bnQsIFs9XSgpIG11dGFibGUKICAgIHsKICAgICAgICByZXR1cm4gY291bnQtLTsKICAgIH0pOwogICAgYXV0byBwcmludF9oYW5vaT1bXShIYW5vaVBpbiAmaCkKICAgIHsKICAgICAgICBjb3V0IDw8ICJ8IjsKICAgICAgICBmb3IoYXV0byB4IDogaCkKICAgICAgICAgICAgY291dCA8PCB4IDw8ICItIjsKICAgICAgICBjb3V0IDw8IGVuZGw7CiAgICB9OwogICAgYXV0byBwcmludGVyPVsmXQogICAgewogICAgICAgIC8vcHJpbnRfaGFub2koYSk7CiAgICAgICAgLy9wcmludF9oYW5vaShiKTsKICAgICAgICAvL3ByaW50X2hhbm9pKGMpOwogICAgICAgIHN0YXRpYyBhdXRvIGNudCA9IDA7CiAgICAgICAgY291dCA8PCAiTW92ZSAjIiA8PCAoY250KyspIDw8IGVuZGw7CiAgICB9OwogICAgcHJpbnRlcigpOwogICAgbW92ZV9oYW5vaShhLGIsYyxhLnNpemUoKSxwcmludGVyKTsKfQo=