만드는 중입니다

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

스타블로

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

요약
루트가 있는 트리와 각 노드의 값이 주어집니다. 노드 x를 y와 그 자손 사이에 잠시 끼워 넣은 뒤 y의 가중 거리 합 f(y)를 구합니다.
난이도

어려움10점 중 8점

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

문제

토니는 HONI(및 COCI)에 낼 문제를 만들기로 했다. 아이들을 좋아하지 않는 그는 문제를 최대한 어렵게 만들었다. 참가자를 괴롭히려고 끊임없이 변하는 트리에 관한 복잡한 문제를 고안했다.

가중치가 없는 트리가 루트를 정점 11로 하는 정점 NN개로 주어진다. 각 정점 ii에는 값 viv_i가 있다. 트리의 구조는 배열 pip_i로 주어지며, 11부터 N−1N-1까지의 각 ii에 대해 pip_i는 정점 i+1i+1의 부모다.

정점 yy에 대해 다음과 같이 정의한다.

f(y)=∑x∈Syd(x,y)⋅vxf(y) = \sum_{x \in S_y} d(x, y) \cdot v_x

여기서 d(x,y)d(x, y)는 정점 xx와 yy 사이의 거리이고, SyS_y는 yy가 조상인 모든 정점의 집합이다.

QQ개의 질의가 주어지며, 각 질의는 정점 xx와 yy로 이루어진다. 각 질의마다 트리에 다음 변환을 적용한 뒤 f(y)f(y)를 구한다.

  1. xx의 자식을 모두 xx의 부모에게 붙인다.
  2. xx를 트리에서 뗀다.
  3. xx를 yy와, xx가 떨어져 나온 부분트리 쪽 yy의 자손 사이에 다시 끼워 넣는다.

yy가 xx의 부모이면 트리는 바뀌지 않는다. 정점 xx는 항상 yy의 부분트리에 속한다. 변환은 임시로 적용되며, 질의가 끝나면 트리는 원래 상태로 돌아간다.

입력

첫 줄에 두 정수 NN과 QQ가 주어진다 (1≤N,Q≤5⋅1051 \le N, Q \le 5 \cdot 10^5). 각각 정점의 수와 질의의 수다.

둘째 줄에는 NN개의 정수 viv_i (1≤vi≤1061 \le v_i \le 10^6)가 주어진다. 각 정점의 값이다.

셋째 줄에는 N−1N-1개의 정수 pip_i (1≤pi≤i1 \le p_i \le i)가 주어진다. pip_i는 정점 i+1i+1의 부모다.

이어지는 QQ개의 줄에는 각각 두 정수 xx와 yy (1≤x,y≤N1 \le x, y \le N)가 주어진다.

출력

각 질의에 대해, 변환을 적용한 트리에서의 f(y)f(y) 값을 다음 QQ개의 줄에 한 줄씩 출력한다.

힌트

위 첫 번째 테스트에 대한 설명: 변환 후 정점 33은 정점 11과 거리 11에 있고, 정점 22는 정점 11과 거리 22에 있다. 결과는 3+2⋅2=73 + 2 \cdot 2 = 7이다.

예제3

  1. 예제 1

    입력
    3 1
    1 2 3
    1 2
    3 1
    
    예상 출력
    7
    
  2. 예제 2

    입력
    3 2
    4 5 6
    1 1
    2 1
    3 1
    
    예상 출력
    11
    11
    
  3. 예제 3

    입력
    5 3
    2 5 2 2 2
    1 2 3 2
    4 3
    3 2
    5 1
    
    예상 출력
    2
    8
    26