서울과학고대유적 탐험하기 1

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

요약
각 시작 정점 i에 대해 최소 번호 우선 규칙으로 생성된 탐험 순서에서 특정 위치의 정점을 질문해, N개 정점의 트리 구조를 복원한다.
난이도

어려움10점 중 9점

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

문제

서울과학고대유적 탐험하기 1, 2 문제는 질문의 유형을 제외한 모든 사항이 동일합니다.

이 문제는 인터랙티브 문제입니다.

최근 고고학자들은 "서울과학고대유적"이라는 고대 유적을 발견하였다!

서울과학고대유적은 11번부터 NN번까지 NN개의 유적들과 서로 다른 두 유적을 연결하는 N−1N-1개의 도로로 연결된 트리 형태로 표현할 수 있다. 모든 도로는 양방향으로 이동할 수 있고, 도로를 이용해 모든 유적 사이를 이동할 수 있다.

서울과학고대유적의 도로들은 세월이 지나면서 사라진 지 오래지만, 도로에 대한 정보를 얻을 수 있는 탐험록이 전해져 내려오고 있다. 탐험록은 NN개의 탐험 기록으로 이루어져 있고, 각 탐험 기록은 NN개의 유적들을 특정한 순서로 방문한 기록이다.

고고학자들이 서울과학고대유적 탐험록을 분석한 결과, ii번째 탐험 기록은 다음과 같은 방법으로 유적들을 방문한 결과임을 밝혀냈다.

  • 탐험은 ii번 유적에서 시작한다. 즉, ii번째 탐험 기록에는 ii번 유적이 첫 번째로 기록되어 있다.
  • 현재 위치한 유적과 도로로 직접 연결된 유적 중 아직 방문하지 않은 유적이 존재한다면, 그들 중 번호가 가장 작은 유적을 방문하고 탐험록에 기록한다.
  • 만약 도로로 직접 연결된 유적들이 모두 방문되었다면, 도로로 직접 연결된 유적 중 ii번 유적과 가장 가까운 유적으로 이동한다. 이 경우 현재 유적이 ii번 유적이 아님을 증명할 수 있다.
  • 모든 유적을 방문하였을 때 탐험을 종료한다.

단, 위의 방법으로 탐험을 진행하였을 때 시작점에 관계 없이 모든 유적을 방문하고 탐험록에 기록함을 증명할 수 있다.

서울과학고대유적의 구조를 알아내기 위해 당신은 다음과 같은 질문을 할 수 있다:

  • ? i j: ii번 탐험 기록에 기록된 유적의 순서 중 jj번째로 기록된 유적의 번호를 질문한다.

이때, 서울과학고대유적의 구조를 알아내는 프로그램을 작성하자.

제한

  • 2≤N≤1032 \le N \le 10^3

힌트

출력 버퍼를 비우는 방법은 다음과 같다.

  • C: fflush(stdout)
  • C++: std::cout << std::flush
  • Java: System.out.flush()
  • Python: sys.stdout.flush()

이외의 언어에 대해서는 언어별 명세를 참고해야 한다.

예제1

  1. 예제 1

    입력
    5
    
    2
    
    5
    
    5
    
    4
    ​
    ​
    ​
    ​
    ​
    
    예상 출력
    
    ? 1 3
    
    ? 1 5
    
    ? 2 4
    
    ? 4 1
    
    !
    1 3
    3 2
    3 4
    1 5