스타블로
시간 제한2초메모리 제한2048 MB
루트가 있는 트리와 각 노드의 값이 주어집니다. 노드 x를 y와 그 자손 사이에 잠시 끼워 넣은 뒤 y의 가중 거리 합 f(y)를 구합니다.
문제
토니는 HONI(및 COCI)에 낼 문제를 만들기로 했다. 아이들을 좋아하지 않는 그는 문제를 최대한 어렵게 만들었다. 참가자를 괴롭히려고 끊임없이 변하는 트리에 관한 복잡한 문제를 고안했다.
가중치가 없는 트리가 루트를 정점 로 하는 정점 개로 주어진다. 각 정점 에는 값 가 있다. 트리의 구조는 배열 로 주어지며, 부터 까지의 각 에 대해 는 정점 의 부모다.
정점 에 대해 다음과 같이 정의한다.
여기서 는 정점 와 사이의 거리이고, 는 가 조상인 모든 정점의 집합이다.
개의 질의가 주어지며, 각 질의는 정점 와 로 이루어진다. 각 질의마다 트리에 다음 변환을 적용한 뒤 를 구한다.
- 의 자식을 모두 의 부모에게 붙인다.
- 를 트리에서 뗀다.
- 를 와, 가 떨어져 나온 부분트리 쪽 의 자손 사이에 다시 끼워 넣는다.
가 의 부모이면 트리는 바뀌지 않는다. 정점 는 항상 의 부분트리에 속한다. 변환은 임시로 적용되며, 질의가 끝나면 트리는 원래 상태로 돌아간다.
입력
첫 줄에 두 정수 과 가 주어진다 (). 각각 정점의 수와 질의의 수다.
둘째 줄에는 개의 정수 ()가 주어진다. 각 정점의 값이다.
셋째 줄에는 개의 정수 ()가 주어진다. 는 정점 의 부모다.
이어지는 개의 줄에는 각각 두 정수 와 ()가 주어진다.
출력
각 질의에 대해, 변환을 적용한 트리에서의 값을 다음 개의 줄에 한 줄씩 출력한다.
힌트
위 첫 번째 테스트에 대한 설명: 변환 후 정점 은 정점 과 거리 에 있고, 정점 는 정점 과 거리 에 있다. 결과는 이다.