만드는 중입니다

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

트리 탐색기 (Hard)

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

요약
폴더 트리에서 커서를 옮기는 move 명령과 폴더를 접거나 펴는 toggle 명령을 처리하고, 각 move 후 커서가 가리키는 폴더 번호를 출력합니다.
난이도

보통10점 중 7점

유형
트리, DFS, 세그먼트 트리, 구현
정답자
아직 제출이 없습니다

문제

폴더 구조를 쉽게 탐색할 수 있는 트리 탐색기 기능을 개발하고 있습니다.

폴더에는 11번부터 NN번까지 번호가 붙어 있습니다. 폴더는 트리 형태의 계층 구조를 이루며, 한 폴더는 다른 폴더를 하위 폴더로 가질 수 있습니다. 어떤 폴더가 다른 폴더를 포함한다는 것은, 그 폴더의 하위 폴더이거나 하위 폴더가 포함하는 폴더라는 뜻입니다. 11번 폴더는 최상위 폴더로, 다른 모든 폴더를 포함합니다.

탐색기는 11번 폴더의 하위 폴더들을 목록에 표시합니다. 11번 폴더 자체는 표시하지 않습니다. 모든 폴더는 펼치거나 접을 수 있습니다. 처음에는 모든 폴더가 접혀 있습니다. 폴더를 펼치면 그 하위 폴더들이 펼친 폴더 바로 아래에 들여쓰기되어 나타납니다. 폴더를 접으면 그 안에 포함된 모든 폴더가 목록에서 사라집니다. 접었던 폴더를 다시 펼치면, 포함된 각 폴더는 이전의 펼침 또는 접힘 상태를 그대로 유지합니다. (그림 1)

폴더를 펼치고 접는 예제. ▽은 펼쳐진 폴더를, ▶은 접힌 폴더를 나타냅니다.

(그림 1) 폴더를 펼치고 접는 예제. ▽은 펼쳐진 폴더를, ▶은 접힌 폴더를 나타냅니다.

탐색기에 커서 기능을 추가합니다. 커서는 처음에 11번 폴더의 첫 번째 하위 폴더를 가리킵니다. 다음 두 가지 명령어를 구현해야 합니다.

  • move kk: 커서를 kk만큼 아래로 이동합니다. kk가 음수이면 −k-k만큼 위로 이동합니다. 이동하다가 목록의 시작이나 끝에 도달하면 더 이상 이동하지 않고 그 자리에 멈춥니다. (그림 2)
  • toggle: 커서가 가리키는 폴더가 접혀 있으면 펼치고, 펼쳐져 있으면 접습니다.

move 명령어의 예제

(그림 2) move 명령어를 사용하는 예제

주어진 QQ개의 명령어를 모두 수행하는 프로그램을 작성하세요.

입력

첫 줄에 폴더의 수 NN과 명령의 수 QQ가 공백으로 구분되어 주어집니다. (2≤N≤200 0002 \le N \le 200\,000; 1≤Q≤200 0001 \le Q \le 200\,000)

다음 NN개의 줄에 폴더의 계층 구조가 주어집니다. ii번째 줄에는 ii번 폴더의 하위 폴더 개수와, 하위 폴더 번호들이 표시되는 순서대로 공백으로 구분되어 주어집니다. 두 폴더가 서로를 포함하는 관계이거나, 두 폴더가 같은 하위 폴더를 공유하는 경우는 없습니다.

다음 QQ개의 줄에 수행할 명령어가 한 줄에 하나씩 차례로 주어집니다. move 명령어와 함께 주어지는 수 kk의 절댓값은 NN을 넘지 않습니다. move 명령어는 적어도 하나 이상 주어집니다.

출력

move 명령어를 수행할 때마다, 이동 후 커서가 위치한 폴더의 번호를 한 줄에 하나씩 출력하세요.

예제1

  1. 예제 1

    입력
    6 13
    2 2 3
    1 6
    1 5
    0
    0
    1 4
    toggle
    move 1
    toggle
    move 1
    toggle
    move 1
    toggle
    move -6
    toggle
    move 2
    move -2
    toggle
    move 2
    
    예상 출력
    6
    4
    3
    2
    5
    2
    4