만드는 중입니다

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

트리와 쿼리 13

시간 제한3초메모리 제한512 MB

요약
루트와 부모가 바뀌는 트리에서 부분 트리와 경로의 값을 대입하거나 더하고, 최솟값, 최댓값, 합을 구하는 문제입니다.
난이도

어려움10점 중 9점

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

문제

N개의 정점으로 이루어진 루트가 있는 트리가 있다. 정점은 1번부터 N번까지 번호가 매겨져 있다. i번 정점의 가중치는 AiA_i이다. 처음에는 r번 정점이 루트이다.

아래의 쿼리를 수행하는 프로그램을 작성하시오.

  • 0 x y: x의 서브트리에 있는 정점들의 가중치를 y로 바꾼다.
  • 1 r: 트리의 루트를 r로 바꾼다.
  • 2 x y z: x와 y를 잇는 경로에 있는 정점들의 가중치를 z로 바꾼다.
  • 3 x: x의 서브트리에 있는 정점들의 가중치의 최솟값을 출력한다.
  • 4 x: x의 서브트리에 있는 정점들의 가중치의 최댓값을 출력한다.
  • 5 x y: x의 서브트리에 있는 정점들의 가중치에 y를 더한다.
  • 6 x y z: x와 y를 잇는 경로에 있는 정점들의 가중치에 z를 더한다.
  • 7 x y: x와 y를 잇는 경로에 있는 정점들의 가중치의 최솟값을 출력한다.
  • 8 x y: x와 y를 잇는 경로에 있는 정점들의 가중치의 최댓값을 출력한다.
  • 9 x y: x의 부모를 y로 바꾼다. 정점 y가 x의 서브트리 안에 있으면 이 쿼리를 무시한다.
  • 10 x y: x와 y를 잇는 경로에 있는 정점들의 가중치의 합을 출력한다.
  • 11 x: x의 서브트리에 있는 정점들의 가중치의 합을 출력한다.

입력

첫 번째 줄에 두 정수 N, M이 주어진다. (1 ≤ N, M ≤ 10510^5)

이후 N-1개의 줄에는 각 간선이 연결하는 두 정점 번호 u, v가 주어진다. (1 ≤ u, v ≤ N)

이후 N개의 줄에는 i번 정점의 가중치 Ai가 주어진다.

이후 줄에는 초기 루트의 정점 번호 r이 주어진다. (1 ≤ r ≤ N)

이후 M개의 줄에는 위에서 설명한 쿼리가 주어진다.

입력되는 모든 정수는 C++ int 형으로 표현할 수 있다. 쿼리를 처리하는 도중 모든 정점의 가중치의 합이 int 범위를 넘지 않도록 입력이 주어진다.

출력

각 쿼리의 결과를 순서대로 한 줄에 하나씩 출력한다.

예제2

  1. 예제 1

    입력
    5 5
    2 1
    3 1
    4 1
    5 2
    4
    1
    4
    1
    2
    1
    10 2 3
    3 1
    7 3 4
    6 3 3 2
    9 5 1
    
    예상 출력
    9
    1
    1
    
  2. 예제 2

    입력
    10 12
    2 1
    3 2
    4 2
    5 3
    6 4
    7 5
    8 2
    9 4
    10 9
    791
    868
    505
    658
    860
    623
    393
    717
    410
    173
    4
    0 8 800
    1 4
    2 8 2 103
    3 9
    4 4
    5 7 304
    6 8 8 410
    7 10 8
    8 1 8
    9 6 9
    10 2 3
    11 5
    
    예상 출력
    173
    860
    103
    791
    608
    1557