#include <iostream>
#include <vector>
using namespace std;
template <typename T>
class GraphNode {
public:
T data;
vector<GraphNode*> adj;
void Print(GraphNode<T>* node) {
if(!node) {
std::cout << "*";
return;
}
std::cout << node->data << ":";
for(typename vector<GraphNode<T>* >::iterator iter = adj.begin();
iter != adj.end();
iter++)
{
Print(iter);
}
}
};
template <typename T>
class BinaryTreeNode : public GraphNode<T> {
public:
using GraphNode<T>::data;
using GraphNode<T>::adj;
BinaryTreeNode<T>* lhs;
BinaryTreeNode<T>* rhs;
BinaryTreeNode() {
adj.push_back(NULL);
adj.push_back(NULL);
lhs = NULL;
rhs = NULL;
}
BinaryTreeNode(T in_data) {
data = in_data;
adj.push_back(NULL);
adj.push_back(NULL);
lhs = NULL;
rhs = NULL;
}
BinaryTreeNode& operator=(const BinaryTreeNode& other) {
// if the other item is this, then return itself
if(&other != this) {
data = other.data;
// copy the vector
lhs = other.lhs;
rhs = other.rhs;
}
return *this;
}
};
int main() {
BinaryTreeNode<int> node;
cout << 42;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCnRlbXBsYXRlIDx0eXBlbmFtZSBUPgpjbGFzcyBHcmFwaE5vZGUgewoKcHVibGljOgogICAgVCBkYXRhOwogICAgdmVjdG9yPEdyYXBoTm9kZSo+IGFkajsKCiAgICB2b2lkIFByaW50KEdyYXBoTm9kZTxUPiogbm9kZSkgewoKICAgICAgICBpZighbm9kZSkgewogICAgICAgICAgICBzdGQ6OmNvdXQgPDwgIioiOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICBzdGQ6OmNvdXQgPDwgbm9kZS0+ZGF0YSA8PCAiOiI7CgogICAgICAgIGZvcih0eXBlbmFtZSB2ZWN0b3I8R3JhcGhOb2RlPFQ+KiA+OjppdGVyYXRvciBpdGVyID0gYWRqLmJlZ2luKCk7CiAgICAgICAgICAgICAgICBpdGVyICE9IGFkai5lbmQoKTsKICAgICAgICAgICAgICAgIGl0ZXIrKykKICAgICAgICB7CiAgICAgICAgICAgIFByaW50KGl0ZXIpOwogICAgICAgIH0KICAgIH0KfTsKCnRlbXBsYXRlIDx0eXBlbmFtZSBUPgpjbGFzcyBCaW5hcnlUcmVlTm9kZSA6IHB1YmxpYyBHcmFwaE5vZGU8VD4gewoKcHVibGljOgogICAgdXNpbmcgR3JhcGhOb2RlPFQ+OjpkYXRhOwogICAgdXNpbmcgR3JhcGhOb2RlPFQ+OjphZGo7CiAgICAKICAgIEJpbmFyeVRyZWVOb2RlPFQ+KiBsaHM7CiAgICBCaW5hcnlUcmVlTm9kZTxUPiogcmhzOwoKICAgIEJpbmFyeVRyZWVOb2RlKCkgewogICAgICAgIGFkai5wdXNoX2JhY2soTlVMTCk7CiAgICAgICAgYWRqLnB1c2hfYmFjayhOVUxMKTsKCiAgICAgICAgbGhzID0gTlVMTDsKICAgICAgICByaHMgPSBOVUxMOwogICAgfQoKICAgIEJpbmFyeVRyZWVOb2RlKFQgaW5fZGF0YSkgewogICAgICAgIGRhdGEgPSBpbl9kYXRhOwoKICAgICAgICBhZGoucHVzaF9iYWNrKE5VTEwpOwogICAgICAgIGFkai5wdXNoX2JhY2soTlVMTCk7CgogICAgICAgIGxocyA9IE5VTEw7CiAgICAgICAgcmhzID0gTlVMTDsKICAgIH0KCgogICAgQmluYXJ5VHJlZU5vZGUmIG9wZXJhdG9yPShjb25zdCBCaW5hcnlUcmVlTm9kZSYgb3RoZXIpIHsKCiAgICAgICAgLy8gaWYgdGhlIG90aGVyIGl0ZW0gaXMgdGhpcywgdGhlbiByZXR1cm4gaXRzZWxmCiAgICAgICAgaWYoJm90aGVyICE9IHRoaXMpIHsKICAgICAgICAgICAgZGF0YSA9IG90aGVyLmRhdGE7CiAgICAgICAgICAgIC8vIGNvcHkgdGhlIHZlY3RvcgogICAgICAgICAgICBsaHMgPSBvdGhlci5saHM7CiAgICAgICAgICAgIHJocyA9IG90aGVyLnJoczsKICAgICAgICB9CiAgICAgICAgcmV0dXJuICp0aGlzOwogICAgfQoKfTsKCmludCBtYWluKCkgewoJQmluYXJ5VHJlZU5vZGU8aW50PiBub2RlOwoJY291dCA8PCA0MjsKCXJldHVybiAwOwp9