만드는 중입니다

아직 만드는 중이라 바뀔 수 있습니다

트트리리와 쿼리

시간 제한2초메모리 제한1024 MB

요약
트리 T의 간선을 (c_i, d_i)로 연결된 T의 복사본으로 바꾼 트리에서, 주어진 두 정점 사이의 거리를 구합니다.
난이도

어려움10점 중 8점

유형
트리, DFS, 구현
정답자
아직 제출이 없습니다

문제

정점이 NN개이고 무방향 간선으로 이루어진 트리 TT가 주어진다. 이때 Ei=(ai,bi)E_i = (a_i, b_i)는 트리 TT에서 ii번째 간선이 aia_i번 정점과 bib_i번 정점을 잇고 있다는 뜻이다.

트리 TT를 가지고 트트리리 SS를 정의한다.

  • 트리 TT와 동일한 N−1N - 1개의 트리 t1,t2,t3,⋯ ,tN−1t_1, t_2, t_3, \cdots, t_{N-1}가 있다.
  • 정수쌍 (ci,di)(c_i, d_i)가 N−1N - 1개 있다. 이때 cic_i, did_i는 트리 tit_i에 속한 서로 다른 두 정점이다.
  • 트리 TT에서 EiE_i를 제거한 후 아래 과정을 진행한다.
    • 트리 TT의 aia_i번 정점과 트리 tit_i의 cic_i번 정점을 잇는 간선을 추가한다.
    • 트리 TT의 bib_i번 정점과 트리 tit_i의 did_i번 정점을 잇는 간선을 추가한다.
    • 트리 tit_i의 모든 정점의 번호에 N×iN \times i를 더한다.

위 과정을 모두 진행한 후 만들어진 트리가 트트리리 SS이다. 트트리리 SS에서 다음 쿼리를 처리하는 프로그램을 작성하시오.

  • uu vv: 정점 uu에서 정점 vv까지의 거리를 출력한다.

입력

첫 번째 줄에 NN과 QQ가 공백으로 구분되어 주어진다.

그다음 줄부터 N−1N - 1개의 줄에 걸쳐 트리 TT의 간선 정보가 주어진다. 그중 ii번째 줄은 EiE_i에 대한 정보이며 aia_i과 bib_i가 공백으로 구분되어 주어진다.

그다음 줄부터 N−1N - 1개의 줄에 걸쳐 정수쌍의 정보가 주어진다. 그중 ii번째 줄은 (ci,di)(c_i, d_i)에 대한 정보이며 cic_i과 did_i가 공백으로 구분되어 주어진다.

그다음 줄부터 QQ개의 줄에 걸쳐 쿼리가 주어진다.

출력

각각의 쿼리의 결과를 순서대로 한 줄에 하나씩 출력한다.

제한

  • 2≤N≤100 0002 \le N \le 100\,000
  • 1≤Q≤100 0001 \le Q \le 100\,000
  • 1≤ai,bi,ci,di≤N1 \le a_i, b_i, c_i, d_i \le N
  • ai≠bia_i \neq b_i
  • ci≠dic_i \neq d_i
  • 1≤i≤N−11 \le i \le N - 1
  • 1≤u,v≤N21 \le u, v \le N^2

예제1

  1. 예제 1

    입력
    4 5
    1 2
    1 3
    1 4
    4 1
    2 4
    3 2
    2 1
    11 1
    3 4
    1 16
    9 9
    
    예상 출력
    3
    3
    8
    3
    0