만드는 중입니다

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

WCWBTT

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

요약
루트가 1인 트리에서 부모를 바꾸는 수정과 두 정점 사이 경로의 정점 집합을 출력하는 질의를 처리합니다.
난이도

어려움10점 중 9점

유형
트리, 분할 정복, 구현
정답자
아직 제출이 없습니다

문제

이 문제는 대화형 문제이다.

정점 1을 루트로 하는 루트 트리를 관리해야 한다. 트리에는 nn개의 정점이 있으며, 정점 ii (2≤i≤n2 \le i \le n)의 부모는 pip_i (1≤pi<i1 \le p_i < i)이다.

qq개의 쿼리를 처리해야 하며, 각 쿼리는 다음 두 형태 중 하나이다.

  • ? aa bb: aa에서 bb까지 가는 유일한 단순 경로 위에 있는 모든 정점의 집합 SS를 출력한다.
  • = aa bb: aa의 부모를 bb로 바꾼다(pa←bp_a \leftarrow b). 변경 후에도 정점들이 트리를 이루도록 보장되지만, b<ab < a라는 보장은 없다.

그런데 곧 문제가 드러난다. 집합 SS의 크기가 너무 커서 쿼리마다 모든 원소를 출력할 수 없다.

이를 해결하기 위해 정수 집합을 유지하고 빠르게 연산하는 특수한 컴퓨터를 설계했다. 이 컴퓨터가 처음 가진 것은 n+1n+1개의 집합 S0,S1,…,SnS_0, S_1, \ldots, S_n뿐이다. 여기서 S0=∅S_0 = \varnothing이고, 1≤i≤n1 \le i \le n에 대해 Si={i}S_i = \{i\}이다.

이 컴퓨터는 두 가지 연산만 지원한다.

  • + aa bb: 새 집합 Sc=Sa∪SbS_c = S_a \cup S_b를 만든다. 이때 Sa∩Sb=∅S_a \cap S_b = \varnothing이어야 한다. cc는 존재하는 모든 집합 ID의 최댓값에 1을 더한 값이다. 비용은 ∣Sa∣+∣Sb∣|S_a| + |S_b|이다.
  • ! kk x1x_1 x2x_2 …\ldots xkx_k: Sx1∪Sx2∪⋯∪SxkS_{x_1} \cup S_{x_2} \cup \cdots \cup S_{x_k}를 답으로 출력한다. 모든 1≤i<j≤k1 \le i < j \le k에 대해 Sxi∩Sxj=∅S_{x_i} \cap S_{x_j} = \varnothing이어야 한다. 비용은 kk이다.

이 컴퓨터를 사용할 때 다음 제한을 지켜야 한다.

  • 각 연산의 비용은 7000을 넘을 수 없다.
  • 모든 연산 비용의 합은 7.5⋅1077.5 \cdot 10^7을 넘을 수 없다.
  • 전체 연산 횟수는 5⋅1065 \cdot 10^6을 넘을 수 없다.

입력

첫 줄에 두 정수 nn과 qq (1≤n≤2⋅1051 \le n \le 2 \cdot 10^5, 1≤q≤2.5⋅1041 \le q \le 2.5 \cdot 10^4)가 주어진다.

다음 줄에는 정수 p2,p3,…,pnp_2, p_3, \ldots, p_n (1≤pi<i1 \le p_i < i)이 주어지며, 이는 각 정점의 초기 부모이다.

힌트

샘플 입출력은 대화 방식을 보여 주기 위한 것이다. 빈 줄과 출력 비우기 표시는 읽기 편의를 위한 것이므로 출력하면 안 된다.

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

  • S0=∅S_0 = \varnothing
  • S1={1}S_1 = \{1\}
  • S2={2}S_2 = \{2\}
  • S3={3}S_3 = \{3\}
  • S4={1,2}S_4 = \{1, 2\}
  • S5={1,2,3}S_5 = \{1, 2, 3\}
  • S6={1,2}S_6 = \{1, 2\}
  • S7={1,3}S_7 = \{1, 3\}

예제1

  1. 예제 1

    입력
    3 3
    1 2
    
    ? 2 3
    
    
    
    = 3 1
    
    
    ? 2 3
    
    
    
    예상 출력
    + 1 2
    
    + 3 4
    ! 2 2 3
    <flush the output>
    
    + 1 2
    + 1 3
    
    ! 2 2 7
    <flush the output>