WCWBTT
시간 제한20초메모리 제한1024 MB
루트가 1인 트리에서 부모를 바꾸는 수정과 두 정점 사이 경로의 정점 집합을 출력하는 질의를 처리합니다.
문제
이 문제는 대화형 문제이다.
정점 1을 루트로 하는 루트 트리를 관리해야 한다. 트리에는 개의 정점이 있으며, 정점 ()의 부모는 ()이다.
개의 쿼리를 처리해야 하며, 각 쿼리는 다음 두 형태 중 하나이다.
?: 에서 까지 가는 유일한 단순 경로 위에 있는 모든 정점의 집합 를 출력한다.=: 의 부모를 로 바꾼다(). 변경 후에도 정점들이 트리를 이루도록 보장되지만, 라는 보장은 없다.
그런데 곧 문제가 드러난다. 집합 의 크기가 너무 커서 쿼리마다 모든 원소를 출력할 수 없다.
이를 해결하기 위해 정수 집합을 유지하고 빠르게 연산하는 특수한 컴퓨터를 설계했다. 이 컴퓨터가 처음 가진 것은 개의 집합 뿐이다. 여기서 이고, 에 대해 이다.
이 컴퓨터는 두 가지 연산만 지원한다.
+: 새 집합 를 만든다. 이때 이어야 한다. 는 존재하는 모든 집합 ID의 최댓값에 1을 더한 값이다. 비용은 이다.!: 를 답으로 출력한다. 모든 에 대해 이어야 한다. 비용은 이다.
이 컴퓨터를 사용할 때 다음 제한을 지켜야 한다.
- 각 연산의 비용은 7000을 넘을 수 없다.
- 모든 연산 비용의 합은 을 넘을 수 없다.
- 전체 연산 횟수는 을 넘을 수 없다.
입력
첫 줄에 두 정수 과 (, )가 주어진다.
다음 줄에는 정수 ()이 주어지며, 이는 각 정점의 초기 부모이다.
힌트
샘플 입출력은 대화 방식을 보여 주기 위한 것이다. 빈 줄과 출력 비우기 표시는 읽기 편의를 위한 것이므로 출력하면 안 된다.

그림은 샘플 테스트 케이스에 해당한다.