헝가리에는 0부터 N−1까지 번호가 매겨진 N개의 도시가 있다.
도시들은 0부터 N−2까지 번호가 매겨진 N−1개의 양방향 도로로 연결되어 있다. 도로 j (0≤j≤N−2)는 도시 U[j]와 도시 V[j]를 연결하며 길이는 T[j]이다. 즉, 이 도로를 이용하면 두 도시 사이를 이동하는 데 T[j] 단위의 시간이 걸린다. 각 도로는 서로 다른 두 도시를 연결하며, 각 도시 쌍을 연결하는 도로는 최대 하나이다.
서로 다른 두 도시 a와 b 사이의 경로는 다음 조건을 만족하는 서로 다른 도시들의 수열 p0,p1,…,pl이다.
- p0=a,
- pl=b,
- 각 i (0≤i<l)에 대해, 도시 pi와 pi+1을 연결하는 도로가 있다.
도로를 이용하여 어떤 도시에서든 다른 모든 도시로 이동할 수 있다. 즉, 서로 다른 모든 두 도시 사이에 경로가 존재한다. 임의의 두 도시를 연결하는 경로는 유일하다는 점에 유의하라.
도시 a와 b 사이의 거리는 d(a,b)로 표기하며 다음과 같이 정의한다.
- a=b이면 d(a,b)=0이다.
- 그렇지 않으면 d(a,b)는 a와 b 사이의 경로에서 연속한 도시들을 연결하는 도로 길이의 합이다.
Karcsi는 도시들에서 여러 건의 배달을 완료해야 하는 트럭 운전사이다. 0부터 N−1까지의 각 i에 대해, Karcsi는 도시 i에서 W[i]건의 배달을 완료해야 한다. Karcsi는 도시 0에서 출발하며, 배달을 어떤 순서로든 완료한 뒤 도시 0으로 돌아온다. 배달 계획은 각 i (0≤i<N)에 대해 도시 i를 정확히 W[i]번 포함하는 도시들의 (비어 있을 수도 있는) 수열 c1,c2,…,cm이다.
계획 c1,c2,…,cm의 배달 시간은 수열 0,c1,c2,…,cm,0에서 연속한 도시들 사이의 거리의 합, 즉 d(0,c1)+d(c1,c2)+⋯+d(cm,0)이다.
Karcsi는 Q일 동안 일해야 한다. 매일 시작할 때 도시 하나에서 필요한 배달 횟수가 변경된다. 어떤 도시 S와 음이 아닌 정수 X에 대해 W[S]의 값이 X가 된다. W[S]의 값은 이후 어느 날의 시작 시점에 다시 변경되기 전까지 X로 유지된다.
Karcsi는 시간당 보수를 받는다. 그는 가능한 모든 계획 중 배달 시간이 최대가 되도록 배달 계획을 선택하려 한다. Karcsi가 일해야 하는 각 날짜의 최대 배달 시간을 계산하는 것이 여러분의 과제이다.
구현 세부사항
두 개의 프로시저를 구현해야 한다.
void init(int N, int[] U, int[] V, int[] T, int[] W)
- N: 도시의 수.
- U,V: 도로의 연결 관계를 나타내는 길이 N−1의 배열.
- T: 도로 길이를 나타내는 길이 N−1의 배열.
- W: 각 도시의 배달 횟수를 나타내는 길이 N의 배열.
- 이 프로시저는 각 테스트 케이스마다
max_time을 호출하기 전에 정확히 한 번 호출된다.
int64 max_time(int S, int X)
- S,X: 배달 횟수의 변경을 나타내는 정수. W[S]의 값을 X로 설정해야 한다.
- 이 프로시저는 먼저 지정된 갱신을 수행한 다음, 가능한 모든 배달 계획 중 최대 배달 시간을 반환해야 한다.
- 이 프로시저는 정확히 Q번 호출된다.
예제
다음 호출 수열을 살펴보자.
init(5, [0, 0, 1, 1], [1, 2, 3, 4], [1, 2, 3, 1], [0, 0, 1, 0, 1])
매개변수들은 아래의 도로망에 해당한다. 빨간색 숫자는 각 도시의 초기 배달 횟수를 나타낸다.

max_time(0, 1)
갱신 후에는 W=[1,0,1,0,1]이다. 가능한 배달 계획 하나는 수열 4,2,0이다. 이 경우 Karcsi는 도시 0,4,2,0,0을 이 순서로 방문하며, 배달 시간은 d(0,4)+d(4,2)+d(2,0)+d(0,0)=2+4+2+0=8이다.
배달 시간이 8보다 큰 배달 계획은 없으므로, 프로시저는 8을 반환해야 한다.
max_time 호출의 추가 예시는 다음 표에 정리되어 있다.
| 호출 | 갱신 후의 W | 최적 계획 | 최대 배달 시간 |
|---|
max_time(3, 3) | [1,0,1,3,1] | 3,0,3,2,3,4 | 4+4+4+6+6+4+2=30 |
max_time(0, 0) | [0,0,1,3,1] | 3,2,3,4,3 | 4+6+6+4+4+4=28 |
max_time(4, 0) | [0,0,1,3,0] | 3,2,3,3 | 4+6+6+0+4=20 |
max_time(2, 0) | [0,0,0,3,0] | 3,3,3 | 4+0+0+4=8 |
max_time(3, 0) | [0,0,0,0,0] | 비어 있음 | 0 |
제약 조건
- 2≤N≤100000
- 0≤U[j]<V[j]<N (0≤j≤N−2인 각 j에 대해)
- 1≤T[j]≤1000 (0≤j≤N−2인 각 j에 대해)
- 도로를 이용하여 어떤 도시에서든 다른 모든 도시로 이동할 수 있다.
- 0≤W[i]≤106 (0≤i<N인 각 i에 대해)
- 1≤Q≤300000
- 0≤S<N
- 0≤X≤106
서브태스크
- (8점) N=2
- (21점) N,Q≤1000
- (14점) 0≤j≤N−2인 각 j에 대해 U[j]=⌊2j⌋이고 V[j]=j+1이다.
- (21점) 0≤j≤N−2인 각 j에 대해 U[j]=j이고 V[j]=j+1이다.
- (36점) 추가 제약 조건이 없다.