#include <set>
#include <deque>
#include <iostream>
using namespace std;
template < typename T >
class Tree {
struct compare {
bool operator( ) ( const Tree * t1,
const Tree * t2) const {
return t1- > GetContent( ) < t2- > GetContent( ) ;
}
} ;
typedef typename std:: multiset < Tree * , typename Tree:: compare > NodeSet;
private :
NodeSet children;
T content;
public :
Tree& AppendNode( const T& node) {
Tree * t = new Tree( node) ;
AttachTree( t) ;
return * t;
}
void Clear( ) {
typename NodeSet:: iterator it = children.begin ( ) ;
while ( children.end ( ) ! = it) {
children.erase ( * it) ;
delete * it;
it++ ;
}
}
const T& GetContent( ) const {
return content;
}
Tree( const T& root) {
content = root;
}
void AttachTree( Tree* t) {
children.insert ( t) ;
}
void Visit( std:: deque < T> & exp ) const {
exp .push_back ( content) ;
typename NodeSet:: iterator it = children.begin ( ) ;
while ( it ! = children.end ( ) ) {
( * it) - > Visit( exp ) ;
it++ ;
}
}
Tree( ) { }
Tree( Tree & c) {
c.DeepCopyTo ( this ) ;
}
T & operator = ( const Tree & b) {
b.DeepCopyTo ( this ) ;
}
~Tree( ) {
Clear( ) ;
}
void DeepCopyTo( Tree* dest) const {
dest- > content = content;
typename NodeSet:: iterator it = children.begin ( ) ;
while ( it ! = children.end ( ) ) {
Tree* t = new Tree( ) ;
( * it) - > DeepCopyTo( t) ;
dest- > AttachTree( t) ;
it++ ;
}
}
} ;
ICAgIAogICAgI2luY2x1ZGUgPHNldD4gCiAgICAjaW5jbHVkZSA8ZGVxdWU+IAogICAgI2luY2x1ZGUgPGlvc3RyZWFtPgogICAgICB1c2luZyBuYW1lc3BhY2Ugc3RkOwogICAgCiAgICB0ZW1wbGF0ZSA8IHR5cGVuYW1lIFQgPgogICAgY2xhc3MgVHJlZSB7CgogICAgc3RydWN0IGNvbXBhcmUgewogICAgICBib29sIG9wZXJhdG9yKCkoY29uc3QgVHJlZSAqIHQxLAogICAgICAgIGNvbnN0IFRyZWUgKiB0MikgY29uc3QgewogICAgICAgIHJldHVybiB0MS0+IEdldENvbnRlbnQoKSA8IHQyLT4gR2V0Q29udGVudCgpOwogICAgICB9CiAgICB9OwoKICAgIHR5cGVkZWYgdHlwZW5hbWUgc3RkOjptdWx0aXNldCA8IFRyZWUgKiAsIHR5cGVuYW1lIFRyZWU6OmNvbXBhcmUgPiBOb2RlU2V0OwoKICAgIHByaXZhdGU6CiAgICAgIE5vZGVTZXQgY2hpbGRyZW47CiAgICBUIGNvbnRlbnQ7CgogICAgcHVibGljOgoKICAgICAgVHJlZSYgQXBwZW5kTm9kZShjb25zdCBUJiBub2RlKSB7CiAgICAgICAgVHJlZSAqdCA9IG5ldyBUcmVlKG5vZGUpOwogICAgICAgIEF0dGFjaFRyZWUodCk7CiAgICAgICAgcmV0dXJuICp0OwogICAgICB9CiAgICB2b2lkIENsZWFyKCkgewogICAgICB0eXBlbmFtZSBOb2RlU2V0OjppdGVyYXRvciBpdCA9IGNoaWxkcmVuLmJlZ2luKCk7CiAgICAgIHdoaWxlIChjaGlsZHJlbi5lbmQoKSAhPSBpdCkgewogICAgICAgIGNoaWxkcmVuLmVyYXNlKCAqaXQpOwogICAgICAgIGRlbGV0ZSAqaXQ7CiAgICAgICAgaXQrKzsKICAgICAgfQoKICAgIH0KICAgIGNvbnN0IFQmIEdldENvbnRlbnQoKSBjb25zdCB7CiAgICAgIHJldHVybiBjb250ZW50OwogICAgfQogICAgVHJlZShjb25zdCBUJiByb290KSB7CiAgICAgIGNvbnRlbnQgPSByb290OwogICAgfQogICAgdm9pZCBBdHRhY2hUcmVlKFRyZWUqIHQpIHsKICAgICAgY2hpbGRyZW4uaW5zZXJ0KHQpOwogICAgfQogICAgdm9pZCBWaXNpdChzdGQ6OmRlcXVlIDxUPiYgZXhwKSBjb25zdCB7CiAgICAgIGV4cC5wdXNoX2JhY2soY29udGVudCk7CiAgICAgIHR5cGVuYW1lIE5vZGVTZXQ6Oml0ZXJhdG9yIGl0ID0gY2hpbGRyZW4uYmVnaW4oKTsKICAgICAgd2hpbGUgKGl0ICE9IGNoaWxkcmVuLmVuZCgpKSB7CiAgICAgICAgKCppdCkgLT4gVmlzaXQoZXhwKTsKICAgICAgICBpdCsrOwogICAgICB9CiAgICB9CiAgICBUcmVlKCkge30KICAgIFRyZWUoVHJlZSAmIGMpIHsKICAgICAgYy5EZWVwQ29weVRvKHRoaXMpOwogICAgfQogICAgVCAmIG9wZXJhdG9yID0gKGNvbnN0IFRyZWUgJiBiKSB7CiAgICAgIGIuRGVlcENvcHlUbyh0aGlzKTsKICAgIH0KICAgIH5UcmVlKCkgewogICAgICBDbGVhcigpOwogICAgfQogICAgdm9pZCBEZWVwQ29weVRvKFRyZWUqIGRlc3QpIGNvbnN0IHsKICAgICAgZGVzdC0+Y29udGVudCA9IGNvbnRlbnQ7CiAgICAgIHR5cGVuYW1lIE5vZGVTZXQ6Oml0ZXJhdG9yIGl0ID0gY2hpbGRyZW4uYmVnaW4oKTsKICAgICAgd2hpbGUgKGl0ICE9IGNoaWxkcmVuLmVuZCgpKSB7CiAgICAgICAgVHJlZSogdCA9IG5ldyBUcmVlKCk7CiAgICAgICAgKCppdCktPkRlZXBDb3B5VG8odCk7CiAgICAgICAgZGVzdC0+QXR0YWNoVHJlZSh0KTsKICAgICAgICBpdCsrOwogICAgICB9CiAgICB9CgogIH07