AP 위의 수업은?

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

요약
가중치 트리에서 집합 S를 동적으로 갱신하며, 한 정점에서 S의 모든 정점까지 거리의 합과 경로 합집합의 가중치를 구한다.
난이도

어려움10점 중 9점

유형
트리, 동적 계획법, 누적 합, 분할 정복
정답자
아직 제출이 없습니다

문제

AP 위의 수업은? 온라인 수업

MatKor의 규모가 점점 커지면서, MatKor 세미나도 온라인으로 진행하고자 한다. 민재는 세미나를 위해 네트워크를 설계했다. 네트워크는 NN명의 부원이 각자 한 개의 정점에 위치하고, 정점들 사이의 무방향 간선으로 통신할 수 있는 트리(사이클이 없는 연결 그래프) 형태이다. 편의상 모든 정점들의 집합을 VV, 모든 간선들의 집합을 EE라고 하자. 간선들은 해당 간선을 사용하기 위한 비용이 있는데, 간선 ee의 비용을 w_ew\_e로 정의한다.

NN명의 부원과 NN개의 노드는 각각 11번부터 NN번까지 번호가 매겨져 있으며, ii번 부원은 ii번 노드에 위치한다. 초기에 MM명이 세미나를 신청했으며, 이 부원들이 위치한 정점들의 집합을 S(⊆V)S\left( \subseteq V \right)라고 하자.

두 정점 u,vu,v에 대해 E_u,vE\_{u,v}는 uu와 vv 사이 경로의 간선들의 집합을 의미하며, d_u,vd\_{u,v}는 uu와 vv 사이 경로의 비용의 합 즉, ∑_e∈E_u,vw_e\sum\_{e\in E\_{u,v}}w\_e을 의미한다. 이때 u=vu=v라면 E_u,v=∅E\_{u,v}=\varnothing이며, d_u,v=0d\_{u,v}=0이다.

이제 민재는 NN개의 정점 중 한 곳에서 세미나를 송출할 것인데, 세미나를 듣는 모든 부원까지 도달하기까지 총 비용이 얼마나 되는지를 알고 싶다. 이때 중복되는 간선에 대해 중복되는 횟수만큼 비용을 더하는 경우와 한 번만 더하는 경우 모두 알고 싶다. 중복되는 횟수만큼 비용을 더하는 경우를 트래픽합, 한 번만 더하는 경우를 하드웨어합이라 정의힌다. 세미나를 진행하는 도중 신청하지 않았던 인원이 새로 신청할 수도, 신청했던 인원이 신청을 취소할 수도 있으므로 이를 실시간으로 반영하여 계산해야 한다.

민재는 이를 해결하기 위해 다음 세 종류의 쿼리를 수행하는 프로그램을 작성하면 된다는 사실을 알았다.

  • 1 vv : vv번 부원이 세미나 신청 여부를 반전시킨다. 즉, v∈Sv\in S라면 S\leftarrow S\setminus\left\\{ v \right\\}를, v∉Sv\notin S라면 S\leftarrow S\cup\left\\{ v \right\\}를 SS에 반영한다.
  • 2 vv : vv번 부원이 위치한 정점에서 세미나를 송출했을 때 트래픽합을 출력한다. 즉, ∑_s∈Sd_s,v\sum\_{s\in S}d\_{s,v}를 출력한다.
  • 3 vv : vv번 부원이 위치한 정점에서 세미나를 송출했을 때 하드웨어합을 출력한다. 즉, E_v(S)=⋃_s∈SE_s,vE\_v\left( S \right) =\bigcup\_{s\in S}E\_{s,v}이라 할 때, ∑_e∈E_v(S)w_e\sum\_{e\in E\_v\left( S \right)}w\_e를 출력한다.

위의 세 종류의 쿼리를 수행하는 프로그램을 작성해 보자.

입력

첫 번째 줄에 부원의 수 N(1≤N≤105)N(1\le N\le 10^5)과 초기에 세미나를 신청한 부원의 수 M(0≤M≤N)M(0\le M\le N)과 쿼리의 개수 Q(1≤Q≤105)Q(1\le Q\le 10^5)이 공백으로 구분되어 주어진다.

두 번째 줄에 초기에 세미나를 신청한 MM명의 서로 다른 번호 s_i(1≤s_i≤N)s\_i(1\le s\_i\le N)가 오름차순으로 공백으로 구분되어 주어진다. 이때, M=0M=0이라면 빈 줄이 주어진다.

세 번째 줄부터 N−1N-1 줄에 걸쳐 트리의 간선 e_ie\_i를 구성하는 두 정점 u_i,v_i(1≤u_i\<v_i≤N)u\_i,v\_i(1\le u\_i\<v\_i\le N)와 간선의 비용 w_e_i(1≤w_e_i≤109)w\_{e\_i}(1\le w\_{e\_i}\le 10^9)가 공백으로 구분되어 주어진다.

다음 줄에 각 쿼리의 타입을 의미하는 QQ개의 정수 t_i(1≤t_i≤3)t\_i(1\le t\_i\le 3)가 공백으로 구분되어 주어진다.

각 QQ개의 쿼리에 대해 다음과 같이 v_iv\_i가 결정된다.

  • 첫 번째 쿼리(i=1i=1)의 경우 v_1=1v\_1=1이다.

  • 두 번째 쿼리부터는 ii번째 쿼리의 정점 v_iv\_i는 다음과 같이 직전 쿼리(i−1i-1번째 쿼리)에 의해 결정된다.

    • i−1i-1번째 쿼리가 11번 쿼리 였다면, i−1i-1번째 쿼리 실행 후 SS의 원소의 개수를 tt라 할 때, v_i=((v_i−1+t) mod N)+1v\_i=\left( \left( v\_{i-1}+t \right)\bmod N \right) +1
    • i−1i-1번째 쿼리가 22번 혹은 33번 쿼리 였다면, i−1i-1번째 쿼리의 답이 tt라 할 때, v_i=((v_i−1+t) mod N)+1v\_i=\left( \left( v\_{i-1}+t \right)\bmod N \right) +1

출력

22번 혹은 33번 쿼리가 주어질 때마다 정답을 한 줄에 한 개씩 출력한다. 22번 혹은 33번 쿼리가 하나 이상 주어짐이 보장된다.

예제2

  1. 예제 1

    입력
    10 0 6
    
    1 3 59
    1 5 87
    1 10 52
    2 9 95
    3 4 85
    6 10 51
    7 9 45
    8 10 15
    9 10 86
    1 1 1 2 2 3
    
    예상 출력
    214
    423
    248
    
  2. 예제 2

    입력
    10 5 6
    1 4 5 6 10
    1 3 59
    1 5 87
    1 10 52
    2 9 95
    3 4 85
    6 10 51
    7 9 45
    8 10 15
    9 10 86
    2 1 3 1 2 3
    
    예상 출력
    386
    349
    366
    262