만드는 중입니다

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

Minimax Tree

면접 대비

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

요약
루트를 MAX로 두고 깊이마다 MAX와 MIN을 번갈아 적용하여, 리프 값이 주어진 트리에서 질의된 노드의 미니맥스 값을 구합니다.
난이도

쉬움10점 중 3점

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

문제

Minimax 알고리즘은 체스, 바둑, 틱택토처럼 두 사람이 번갈아 두는 게임에서 쓰인다. 이 알고리즘에 쓰는 Minimax 트리는 상대방이 최선의 수를 둘 때 나에게 미치는 영향이 가장 작도록 만든 게임 트리이다. 기준이 되는 사람(MAX)은 자식 노드 중 값이 가장 큰 것을 고르고, 상대(MIN)는 값이 가장 작은 것을 고른다. 이렇게 양쪽의 최선의 전략을 찾는 방법이다.

Minimax 트리는 다음과 같이 구성된다.

  • 트리에서 리프 노드의 값들은 모두 계산되어 있다.
  • 게임에서 선 플레이어는 MAX player로 루트 노드부터 시작한다.
  • 루트 노드부터 자식 노드로 내려갈 때마다 MAX player와 MIN player가 번갈아 바뀐다.
  • 리프 노드가 아니면서 MAX player인 노드의 값은 자식 노드의 값들 중 최댓값으로 계산한다.
  • 리프 노드가 아니면서 MIN player인 노드의 값은 자식 노드의 값들 중 최솟값으로 계산한다.

수민이는 친구와 게임을 하기로 했다. 게임에서 이기면 받은 점수만큼 상품을 받는다. 수민이는 상품을 최대한 얻으려고 Minimax 트리를 그려 최적의 전략을 찾아 두었다. 그런데 친구가 이를 눈치채고 트리의 숫자 일부에 색칠을 해서 수민이를 방해하기 시작했다. 다행히 친구는 리프 노드의 숫자는 건드리지 않았으므로 리프 노드의 값은 알 수 있다. 트리를 완성하고, 값을 구해야 하는 노드가 주어지면 그 노드의 값을 출력하자.

입력

첫째 줄에 트리 정점의 수 NN과 루트의 번호 RR이 공백으로 구분되어 주어진다. (2≤N≤1052 \leq N \leq 10^5, 1≤R≤N1 \leq R \leq N)

둘째 줄부터 NN번째 줄까지 N−1N - 1줄에 걸쳐 트리 간선의 양 끝 점 u,vu, v가 공백으로 구분되어 주어진다. (1≤u1 \leq u, v≤Nv \leq N, u≠vu \ne v)

이어 리프 노드의 개수 LL이 주어진다. (1≤L≤N1 \leq L \leq N이며 입력으로 주어진 트리의 리프 노드의 개수와 LL은 항상 같다)

다음 LL줄에 걸쳐 리프 노드의 번호 k_ik\_i와 노드의 값 t_it\_i가 공백으로 구분되어 주어진다. (1≤k_i≤N1 \leq k\_i \leq N, 0≤t_i≤1090 \leq t\_i \leq 10^9, 1≤i≤L1 \leq i \leq L)

이어 값을 구해야 할 노드의 개수 QQ가 주어진다. (1≤Q≤1051 \leq Q \leq 10^5)

다음 QQ줄에 걸쳐 값을 구해야 할 노드의 번호 q_iq\_i가 주어진다. (1≤q_i≤N1 \leq q\_i \leq N, 1≤i≤Q1 \leq i \leq Q)

출력

QQ줄에 걸쳐 각 노드의 값을 한 줄에 하나씩 출력한다.

예제1

  1. 예제 1

    입력
    12 1
    1 2
    1 3
    1 4
    2 5
    3 6
    4 7
    4 8
    5 9
    6 10
    6 11
    7 12
    5
    8 10
    9 1
    10 0
    11 2
    12 15
    4
    1
    3
    4
    5
    
    예상 출력
    10
    2
    10
    1