포도나무
시간 제한3초메모리 제한1024 MB
가중치가 있는 트리에서 정점에 포도를 올리고 떼며 간선 길이를 바꿀 때, 주어진 정점에서 가장 가까운 포도가 있는 정점까지의 거리를 구합니다.
문제
Syrup the Turtle이 마을을 휘감으며 자라는 거대한 포도나무에 물을 준다. 포도나무에는 1부터 까지 번호가 붙은 개의 잎이 달린 마디와, 1부터 까지 번호가 붙은 개의 가지가 있다. 번째 가지는 마디 와 를 직접 잇고, 길이는 이다. 같은 두 마디를 직접 잇는 가지는 없으며, 모든 마디는 가지를 따라 직접 또는 간접으로 연결되어 있다.
Syrup은 포도나무를 다음과 같이 바꾸거나 조회할 수 있다.
- 마디 에 물을 준다(soak). 빈 마디였다면 즉시 큰 포도 한 알이 열리고, 포도가 있었다면 그 포도가 떨어진다.
- 마디 와 사이 가지의 길이를 로 바꾼다(anneal).
- 마디 에서 가장 가까운 포도를 찾는다(seek). 거리는 에서 포도가 달린 마디까지 가는 최단 경로의 길이다.
처음에는 포도나무에 포도가 없다. 개의 행동을 순서대로 처리하고, 각 seek의 답을 구하라.
입력
첫 줄에 과 가 주어진다.
이어서 개의 줄에 각각 , , 가 주어진다.
이어서 개의 줄에 행동이 하나씩 주어진다.
1 q: 마디 에서 가장 가까운 포도를 찾는다.2 u: 마디 에 물을 준다.3 a b w: 마디 와 사이 가지의 길이를 로 바꾼다. 이 가지는 반드시 존재한다.
출력
각 seek 행동마다 가장 가까운 포도까지의 거리를 한 줄에 출력한다. 포도가 없으면 을 출력한다.