#include #include #include #include using namespace std; int mv; struct Node { int val; set child; Node(int v) { val = v; } ~Node() { for(set::iterator i = child.begin(); i != child.end(); ++i) delete *i; } bool Next() { int old = val; val = val * 3 + 1; while(val % 2 == 0) val /= 2; if(val == 1) return false; bool bonus = (val > old && child.size() == 0); //?? timing for(set::iterator i = child.begin(); i != child.end();) { if(!(*i)->Next()) { delete *i; child.erase(i++); } else ++i; } if(bonus) { Bonus(); } //mv = max(mv, val); return true; } void Bonus(bool read = false) { int v = (val+1) / 2; if(v % 2 == 0) { if(read) --v; else ++v; } child.insert(new Node(v)); } int FindMax() { int cnt = 1; int m = val; for(set::iterator i = child.begin(); i != child.end(); ++i) { int t = (*i)->FindMax(); if(t < 0) return -1; if(t > m) { m = t; cnt = 1; } else if(t == m) ++cnt; } if(cnt == 1) return m; return -1; } bool SetRoot(int m) { if(val == m) { Bonus(true); return true; } else { for(set::iterator i = child.begin(); i != child.end(); ++i) { if((*i)->SetRoot(m)) { (*i)->child.insert(this); child.erase(i); return true; } } } return false; } int Count() { int r = 1; for(set::iterator i = child.begin(); i != child.end(); ++i) { r += (*i)->Count(); } return r; } void Print() { cout << val << "("; for(set::iterator i = child.begin(); i != child.end(); ++i) { (*i)->Print(); cout << " "; } cout << ")"; } }; Node* root; bool Run() { root->Print(); cout << endl; if(!root->Next()) return false; int m = root->FindMax(); if(m > 0) { root->SetRoot(m); } mv = max(mv, root->Count()); return true; } int main() { int n; while(cin >> n && n) { root = new Node(n); int cnt = 1; mv = 1; for(; Run(); cnt++); cout << cnt << " " << mv << endl; delete root; } }