树上跳棋
时间限制:C/C++/Rust/Pascal 1秒,其他语言2秒
空间限制:C/C++/Rust/Pascal 256 M,其他语言512 M
64bit IO Format: %lld

题目描述

五子棋对于 SRT 同学来说还是太难了,然后他自己造一了种树上跳棋,让自己把把赢。

具体是这样的:

给出一棵 $n$ 个节点的以 $1$ 为根节点的树,$1 \sim n$ 节点在树中都会出现并且仅出现一次,现给出 $q$ 组询问,每次询问给出树上两点 $p_1, p_2$ 及其他们的跳跃距离 $d_1,d_2$,给出的两个点上有两个棋子,他们可以往树根方向跳任意步 (只能向树根方向跳跃,不得跳出根节点) ,现请问两个棋子的最近重合节点是哪个节点?若无解则输出 $-1$(重合节点:两个棋子都可以用整数次跳跃到达的节点,且两个棋子可以不在同一时间重合)

输入描述:

输入的第一行包含一个正整数 n ( 2 \le n \le 2 \times 10 ^ 5) 表示树有 n 个节点

接下来 n-1 行每行包含两个整数 u,v ( 1 \le u,v \le n) 代表 u,v 之间有一条边连接。

接下来一行给出一个正整数 q ( 1 \le q \le 2 \times 10 ^ 5) 代表有 q 组询问。

最后 q 行每行给出四个正整数 p_1,d_1,p_2,d_2 分别代表 棋子 p_1 所在节点、棋子 p_1 的跳跃距离、棋子 p_2 所在节点、棋子 p_2 的跳跃距离。(1 \le p_1,p_2,d_1,d_2 \le n)

输出描述:

输出共有 q 行,每行输出第 i 次询问的答案。

示例1

输入

复制
9
1 2
1 3
2 4
2 5
3 6
3 7
6 8
8 9
5
4 2 9 4
9 3 7 1
9 2 7 2
4 3 2 1
8 2 5 2

输出

复制
1
3
1
-1
-1

说明

询问一:棋子 1 跳一步到节点 1,棋子 2 跳一步到节点 1,所以答案为 1

询问二:棋子 1 跳一步到节点 3,棋子 2 跳一步到节点 3,所以答案为 3

询问三:棋子 1 跳两步到节点 1,棋子 2 跳一步到节点 1,所以答案为 1

可以证明询问 4,5 无解。