트리에서 가장 긴 경로
시간 제한5초메모리 제한1024 MB
가중치가 있는 루트 트리에서 간선 가중치를 갱신하고, 어떤 정점에서 그 정점의 서브트리 안으로 내려가는 최대 가중치 경로를 구하는 질의를 처리한다.
문제
두 친구가 서로에게 프로그래밍 문제를 번갈아 내고 풀며 실력을 겨루고 있습니다. 한 친구가 낸 문제는 다음과 같습니다.
정점이 개이고 각 정점에 의 번호가 붙은 트리가 주어집니다. 부모가 인 정점이 이 트리의 루트입니다. 루트가 아닌 각 정점 는 자신의 부모와 정수 가중치 인 간선으로 이어져 있습니다. 경로의 가중치는 그 경로에 속한 모든 간선의 가중치의 합이며, 단순 경로는 어떤 정점도 두 번 이상 지나지 않는 경로를 말합니다.
다음 두 종류의 질의를 모두 개 처리해야 합니다.
- 유형 (, ): 정점 와 그 부모를 잇는 간선의 가중치를 로 바꿉니다.
- 유형 (): 정점 를 루트로 하는 부분 트리를 생각합니다. 정점 에서 출발하여 이 부분 트리 안에서만 이어지는 단순 경로들 중 가중치가 최대인 값을 출력합니다. 정점 하나로만 이루어진 빈 경로의 가중치는 이므로 답은 항상 이상입니다.
입력
첫째 줄에 정수 ()이 주어집니다.
둘째 줄에 개의 정수 이 주어집니다. 여기서 는 정점 의 부모이며, 정점 가 루트이면 입니다.
셋째 줄에 개의 정수 이 주어집니다. 여기서 는 정점 와 그 부모를 잇는 간선의 처음 가중치입니다 (). 루트의 값은 사용되지 않습니다.
넷째 줄에 정수 ()가 주어집니다.
다음 개의 줄에는 각각 하나의 질의가 주어집니다. 각 줄은 질의의 종류를 나타내는 정수 ()로 시작합니다.
- 이면 뒤에 두 정수 ()와 ()가 옵니다.
- 이면 뒤에 하나의 정수 ()가 옵니다.
출력
유형 질의마다 그 답을 입력에 나타난 순서대로 한 줄에 하나씩 출력합니다. 가중치가 최대인 경로는 가중치가 인 단일 정점 경로일 수도 있으므로, 모든 답은 이상입니다.