#include <iostream>

using namespace std;

struct TNode {
  int m_nVal;
  TNode *m_pLeft;
  TNode *m_pRight;
};

bool hasNode(TNode *pTree, TNode *pNode) {
  if(pTree==pNode)
    return true;

  if(pTree==NULL)
    return false;

  bool has = false;
  if(pTree->m_pLeft!=NULL)
    has = hasNode(pTree->m_pLeft, pNode);

  if(!has && pTree->m_pRight!=NULL)
    has = hasNode(pTree->m_pRight, pNode);

  return has;
}

TNode* last_common_parent(TNode *pTree, TNode *pNode1, TNode *pNode2) {
  if(pTree==NULL || pNode1==NULL || pNode2==NULL)
    return NULL;

  bool leftHasNode1 = false;
  bool leftHasNode2 = false;
  if(pTree->m_pLeft!=NULL) {
    leftHasNode1 = hasNode(pTree->m_pLeft, pNode1);
    leftHasNode2 = hasNode(pTree->m_pRight, pNode2);
  }

  if(leftHasNode1 && leftHasNode2) {
    if(pTree->m_pLeft==pNode1 || pTree->m_pLeft==pNode2)
      return pTree;

    return last_common_parent(pTree->m_pLeft, pNode1, pNode2);
  }

  bool rightHasNode1 = false;
  bool rightHasNode2 = false;
  if(pTree->m_pRight!=NULL) {
    rightHasNode1 = hasNode(pTree->m_pRight, pNode1);
    rightHasNode2 = hasNode(pTree->m_pRight, pNode2);
  }

  if(rightHasNode1 && rightHasNode2) {
    if(pTree->m_pRight==pNode1 || pTree->m_pRight==pNode2)
      return pTree;

    return last_common_parent(pTree, pNode1, pNode2);
  }

  if((leftHasNode1 && rightHasNode2) || (leftHasNode2 && rightHasNode1)) {
    return pTree;
  }

    return NULL;

}

int main(int argc, char **argv) {

  return 0;
}
