struct TreeNode {
int val;
TreeNode *left;
TreeNode *right;
TreeNode() { val = 0, left = nullptr, right = nullptr; }
};
// 判断node是否在以root为头节点的搜索二叉树上
bool isBSTNode(TreeNode *root, TreeNode *node) {
if (!root) return false;
if (root == node) return true;
return isBSTNode( (root->val > node->val) ? root->left : root->right, node);
}
// 搜索以root为头节点的最大拓扑结构
int getSizeFromNode(TreeNode *root, TreeNode *cur) {
if (!root || !cur) return 0;
if (!isBSTNode(root, cur)) return 0;
// 以root为头节点的满足要求,继续从左右子树开始搜索
return 1 + getSizeFromNode(root, cur->left) + getSizeFromNode(root, cur->right);
}
void getMaxTopSize(TreeNode *root,int &ans) {
if (!root) return;
ans = max(ans, getSizeFromNode(root, root));
getMaxTopSize(root->left, ans);
getMaxTopSize(root->right, ans);
}
int main()
{
#ifdef LOCAL
freopen("../leetcode/in.txt", "r", stdin);
#endif
int n, root, ans = 0;
int rt, l, r;
cin >> n >> root;
vector<TreeNode> tree(n + 1);
for (int i = 0; i < n; i++) {
cin >> rt >> l >> r;
tree[rt].val = rt;
if (l) tree[rt].left = &tree[l];
if (r) tree[rt].right = &tree[r];
}
getMaxTopSize(&tree[root], ans);
cout << ans << endl;
return 0;
}