높은 나무에서 내려오지 못하는 Praveen
시간 제한1초메모리 제한1024 MB
트리 노드마다 제거 단계에 따른 값 S가 정해지고, 질의마다 두 노드 사이 경로에서 S의 역순쌍 개수를 구합니다.
문제
Praveen은 높은 나무에 올라갔는데 지금 내려올 수 없다. Arjun이 사다리를 가져올 때까지 기다리면서, 그는 트리의 개 정점에 부터 까지 번호를 붙이고 각 정점에 값 를 하나씩 연결하며 시간을 보내기로 했다. 이를 위해 다음 절차를 수행한다.
val = 1
Let T be our tree.
while T is not empty:
Identify the branching nodes of tree T. A node of tree T is said to be a branching node if its degree > 2.
Choose all the nodes of T which have a path to any leaf node not passing through any of the branching nodes.
Remove all of these chosen nodes from the tree T.
Set S value of all these removed nodes to be val.
Increase val by 1, i.e. val += 1
분기 정점을 찾는 첫 단계는 while 루프가 실행될 때마다 다시 수행된다.
Praveen은 실제로 트리에서 정점을 제거할 수 없다. 머릿속의 슈퍼컴퓨터에서 절차를 시뮬레이션할 뿐이다.
Arjun이 사다리를 들고 돌아온 뒤, Praveen은 트리에 관한 개의 질의를 던진다. 각 질의는 두 정점 , 를 담고 있다. 트리에서 에서 로 가는 경로를 라고 하자. 배열 를 보자. 각 질의마다 Arjun은 이 배열의 역전쌍 개수를 구해야 한다. 두 인덱스 , 가 이고 이면 역전쌍을 이룬다.
Praveen은 Arjun이 모든 질의에 답할 때까지 내려오지 않겠다고 버틴다. Arjun은 머릿속에 슈퍼컴퓨터가 없고 노트북도 집에 두고 왔다. 그러니 질의에 답해서 Praveen을 내려보내 주자.
입력
입력의 첫 줄에 테스트 케이스의 개수 가 주어진다.
각 테스트 케이스는 다음과 같이 주어진다.
첫 줄에 문제에서 정의한 과 가 공백으로 구분되어 주어진다. 다음 개 줄에는 정점 와 사이에 간선이 있음을 뜻하는 두 정수 , 가 주어진다. 다음 개 줄에는 질의의 두 정점 , 가 주어진다.
출력
각 테스트 케이스마다 개의 질의에 대한 답을 한 줄에 하나씩 출력한다.
제한
- 모든 테스트 케이스의 합과 합은 각각 을 넘지 않는다.