brz的扑克
题号:NC212177
时间限制:C/C++/Rust/Pascal 1秒,其他语言2秒
空间限制:C/C++/Rust/Pascal 512 M,其他语言1024 M
64bit IO Format: %lld

题目描述

赌神 送了蒟蒻 一棵扑克树,树的每个点上都放了一张扑克,扑克有正反两面,两面上分别写了两个不同的数字。

但是赌神 提了个要求:你要能回答我的问题才能拥有这棵扑克树。

赌神 提出了 m 个问题,每个问题包含两个整数 x,y,表示依次取出 x 到 y 路径上的扑克排列成一行,可以随意将扑克进行翻转,最后所有扑克朝上的那一面的数字就形成了一个序列,赌神 问你:所有可能的序列中包含的最长顺子的长度是多少?

赌神 对顺子的定义是:1、顺子是序列中的一个连续区间 [l,r];2、设区间最左边的数是 z,那么后面的数依次是 z+1,z+2,...,z+r-l。比如说一个序列 {1,3,4,5,7,6,7},有这些顺子:[1,1],[2,4],[5,5],[6,7]。当然,[2,3] 也是一个顺子,但是他被 [2,4] 包含所以不可能成为最长的顺子,所以可以忽略掉。

(看起来似乎有点抽象,你可以结合样例来理解)

输入描述:

第一行一个整数 n,表示树的大小。

下面 n 行每行两个整数,第 i 行的两个数分别表示第 i 个节点上的扑克的正反两面上的数字。

下面 n-1 行每行两个整数 x,y,表示节点 x 与节点 y 之间有一条边。

下面一行一个整数 m 表示询问数量。

下面 m 行每行两个整数 x,y,表示一次询问,注意,询问之间相互独立,即每次询问完后会把扑克放回树上的原位置。


扑克上的数字

输出描述:

输出 m 行每行一个数,第 i 行的数表示第 i 组询问能找到的最长顺子的长度。
示例1

输入

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

输出

复制
3
3

说明

样例的树长这样:



对于第一组询问,取出 3 到 4 路径上的扑克得到的扑克序列为 (1,2),(1,3),(3,4),让第一张数字 2 朝上,第二张 3 朝上,第三张 4 朝上,最后得到的序列就是 2,3,4,最长顺子就是 2,3,4,长度为 3。

对于第二组询问,扑克序列为 (1,3),(2,4),(5,6),(7,8),可以得到的序列之一是 3,4,5,7,最长顺子为 3,4,5 长度为 3,可以证明不存在更长的顺子。