#include
#include
#include
using namespace std;
struct TreeNode {
int val;
int left;
int right;
};
vector vec;
// 这种方法更练coding一些
unordered_map> maps;
void init_map(TreeNode* root){
if(root == NULL)
return;
unordered_map map_;
maps[root] = map_;
init_map(vec[root->left]);
init_map(vec[root->right]);
}
void head_record(TreeNode* node, TreeNode* head){
if(node == NULL)
return;
maps[node][head] = head;
head_record(vec[node->left], head);
head_record(vec[node->right], head);
}
void pre_right(TreeNode *l, TreeNode* r, TreeNode* root){
if(r == NULL)
return;
maps[l][r] = root;
pre_right(l, vec[r->left], root);
pre_right(l, vec[r->right], root);
}
void pre_left(TreeNode* l, TreeNode* r, TreeNode* root){
if(l == NULL)
return;
pre_right(l, r, root);
pre_left(vec[l->left], r, root);
pre_left(vec[l->right], r, root);
}
void sub_record(TreeNode* root){
if(root == NULL)
return;
pre_left(vec[root->left], vec[root->right], root);
// 原书貌似这里是个冗余操作,加上这两行会超时,去掉会过
// 加入相当于每个点加了个O(n^2)的操作,所以最后相当于O(n^3).
//sub_record(vec[root->left]);
//sub_record(vec[root->right]);
}
void set_map(TreeNode* root){
if(root == NULL)
return;
// 以root为公共祖先的点
head_record(vec[root->left], root);
head_record(vec[root->right], root);
sub_record(root);
set_map(vec[root->left]);
set_map(vec[root->right]);
}
int main(){
int n, root_val;
cin>>n>>root_val;
vec.resize(n+1);
vec[0] = NULL;
for(int i = 0;i
TreeNode* node = new TreeNode();
int fa, lch, rch;
cin>>fa>>lch>>rch;
node->left = lch;
node->right = rch;
node->val = fa;
vec[fa] = node;
}
// 初始化
init_map(vec[root_val]);
// 开始放点
set_map(vec[root_val]);
int m;
cin>>m;
for(int i = 0;i
{
int o1, o2;
cin>>o1>>o2;
//cout<
if(maps[vec[o1]].count(vec[o2])!=0)
cout<val<
if(maps[vec[o2]].count(vec[o1])!=0)
cout<val<
}
return 0;
}