만드는 중입니다

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

가벼운 간선과 무거운 간선

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

요약
각 갱신은 a와 b 사이 경로를 무거운 간선으로 만들고, 경로 위 정점에 붙은 나머지 간선을 가벼운 간선으로 되돌린다. 질의는 두 정점 사이 경로의 무거운 간선 수를 구한다.
난이도

보통10점 중 7점

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

문제

정점이 nn개인 트리가 주어진다. 트리의 각 간선은 가벼운 간선 또는 무거운 간선이다. 이 트리에 대해 mm개의 연산을 수행해야 한다. 처음에는 모든 간선이 가벼운 간선이다. 연산은 두 종류이다.

  1. 두 정점 aa와 bb가 주어진다. aa와 bb를 잇는 경로 위의 모든 정점 xx(aa와 bb 자신을 포함한다)에 대해, xx에 연결된 모든 간선을 가벼운 간선으로 바꾼다. 또한 aa와 bb를 잇는 경로 위의 모든 간선을 무거운 간선으로 바꾼다.

  2. 두 정점 aa와 bb가 주어진다. aa와 bb를 잇는 경로에 있는 무거운 간선의 개수를 구한다.

입력

첫 줄에 테스트 케이스의 개수 TT가 주어진다. 각 테스트 케이스의 첫 줄에는 정점의 개수 nn과 연산의 개수 mm이 주어진다.

다음 n−1n-1개의 줄에는 트리의 간선 uu, vv가 한 줄에 하나씩 주어진다.

다음 mm개의 줄에는 연산 opiop_i, aia_i, bib_i가 한 줄에 하나씩 주어진다. opi=1op_i = 1이면 첫 번째 종류의 연산이고, opi=2op_i = 2이면 두 번째 종류의 연산이다.

모든 연산에서 ai≠bia_i \ne b_i이다.

출력

두 번째 종류의 연산마다 답을 한 줄에 하나씩 출력한다.

제한

모든 테스트 데이터에 대해 T≤3T \le 3이고, 1≤n,m≤1051 \le n,m \le 10^5이다.

예제1

  1. 예제 1

    입력
    1
    7 7
    1 2
    1 3
    3 4
    3 5
    3 6
    6 7
    1 1 7
    2 1 4
    2 2 7
    1 1 5
    2 2 7
    1 2 1
    2 1 7
    
    예상 출력
    1
    3
    2
    1