만드는 중입니다

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

색이 있는 트리

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

요약
각 연산 뒤에 색이 서로 다른 두 정점 사이 거리의 최댓값을 구합니다. 연산은 잎 정점 추가와 정점 색 변경입니다.
난이도

어려움10점 중 8점

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

문제

처음에는 색이 CC인 정점 11 하나만 있는 트리가 주어집니다. 이후 두 종류의 연산이 순서대로 qq개 주어집니다.

  • 00 xx cc dd: 색이 cc인 새 정점을 번호 (n+1)(n + 1)로 트리에 추가합니다. 여기서 nn은 현재 정점의 개수입니다. 정점 xx와 (n+1)(n + 1)을 길이가 dd인 간선으로 잇습니다.
  • 11 xx cc: 정점 xx의 색을 cc로 바꿉니다.

각 연산 후에, 현재 트리에서 색이 서로 다른 두 정점 uu, vv (1≤u,v≤n1 ≤ u, v ≤ n)를 찾아 두 정점 사이의 거리가 최대가 되도록 해야 합니다.

두 정점 uu와 vv의 거리는 트리에서 uu에서 vv까지 가는 최단 경로의 길이입니다.

입력

입력에는 여러 개의 테스트 케이스가 들어 있습니다. 첫 줄에는 테스트 케이스의 개수 TT가 주어집니다. 각 테스트 케이스는 다음과 같습니다.

첫 줄에 연산의 개수 qq와 정점 11의 초기 색 CC가 주어집니다 (1≤q≤5×1051 ≤ q ≤ 5 \times 10^5, 1≤C≤q1 ≤ C ≤ q).

이어지는 qq개의 줄에는 순서대로 연산이 정수 3개 또는 4개로 주어집니다.

  • 줄에 정수 00, xix_i, cic_i, did_i가 주어지면 (1≤xi≤n1 ≤ x_i ≤ n, 1≤ci≤q1 ≤ c_i ≤ q, 1≤di≤1091 ≤ d_i ≤ 10^9), 색이 cic_i인 새 정점 (n+1)(n + 1)을 추가하고 길이 did_i인 간선으로 정점 xix_i와 연결합니다.
  • 줄에 정수 11, xix_i, cic_i가 주어지면 (1≤xi≤n1 ≤ x_i ≤ n, 1≤ci≤q1 ≤ c_i ≤ q), 정점 xix_i의 색을 cic_i로 바꿉니다.

모든 테스트 케이스의 qq 합은 5×1055 \times 10^5을 넘지 않습니다.

출력

각 연산 후에, 색이 서로 다른 두 정점 사이 거리의 최댓값을 출력합니다. 그런 쌍이 없으면 대신 00을 출력합니다.

예제1

  1. 예제 1

    입력
    2
    1 1
    0 1 1 1
    5 1
    0 1 1 1
    0 1 2 1
    0 3 3 1
    1 4 1
    1 3 1
    
    예상 출력
    0
    0
    2
    3
    2
    0