만드는 중입니다

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

Ald

시간 제한4초메모리 제한2048 MB

요약
트리에서 경로를 추가하고 삭제하는 쿼리를 처리하며, 모든 경로로부터 거리가 d 이하인 정점의 수를 구합니다.
난이도

어려움10점 중 9점

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

문제

트리가 주어진다. 트리는 11부터 nn까지 번호가 붙은 nn개의 정점으로 이루어져 있다.

정점 aa와 bb 사이의 경로를 (a,b)(a, b)로 나타낸다. 경로의 dd-집합은 경로 위의 정점 중 하나로부터 거리가 ≤d\le d인 트리의 모든 정점으로 이루어진 집합이다. 예를 들어 경로의 00-집합은 경로의 정점 집합 자체이다. 두 정점 사이의 거리는 두 정점을 잇는 경로의 간선 수이다.

SS를 트리 경로들의 다중집합이라고 하자. 처음에 SS는 비어 있다. 다음 쿼리를 처리하라.

  • 1 uu vv: 경로 (u,v)(u, v)를 SS에 추가한다 (1≤u,v≤n1 \le u, v \le n).
  • 2 uu vv: SS에서 경로 (u,v)(u, v) 하나를 삭제한다 (1≤u,v≤n1 \le u, v \le n). (u,v)(u, v)와 (v,u)(v, u)는 같은 경로를 나타낸다. 예를 들어 S={(2,3),(2,3)}S=\{(2, 3), (2, 3)\}일 때 2 3 2 쿼리를 수행하면 S={(2,3)}S=\{(2, 3)\}이 된다. 이 쿼리를 수행하기 전에 (u,v)(u, v) 또는 (v,u)(v, u)가 SS에 적어도 하나 있음이 보장된다.
  • 3 dd: SS에 있는 모든 경로의 dd-집합의 교집합 크기를 출력한다 (0≤d≤n0 \le d \le n). SS가 비어 있으면 00을 출력한다.

입력

첫 줄에 테스트 케이스의 수 tt가 주어진다 (1≤t≤1041 \le t \le 10^4). 각 테스트 케이스의 첫 줄에는 정점의 수 nn과 쿼리의 수 qq가 주어진다 (1≤n,q≤1051 \le n, q \le 10^5). 이어서 n−1n-1개의 줄에 ii번째 간선의 양 끝점 uiu_i, viv_i가 주어진다. 마지막으로 qq개의 줄에 위에서 설명한 형식의 쿼리가 주어진다. 모든 테스트 케이스에 걸쳐 nn의 합은 10510^5를 넘지 않으며, qq의 합도 10510^5를 넘지 않는다.

출력

3번 유형의 쿼리마다 답을 한 줄에 하나씩 출력한다.

예제1

  1. 예제 1

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