공 굴리기

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

요약
깊이 N인 포화 이진트리에 공을 하나씩 굴려 채울 때, 각 공이 어느 정점에서 멈추는지 주어진 공 번호마다 구한다.
난이도

보통10점 중 7점

유형
트리, 재귀, 구현, 수학
정답자
아직 제출이 없습니다

문제

트리 TT는 깊이가 NN, 정점이 2N−12^{N}-1개이고 루트의 번호가 11인 포화 이진트리이다. 트리의 i(1≤i≤2N−1−1)i(1 \leq i \leq 2^{N - 1} - 1)번 정점의 왼쪽 자식은 2i2i번 정점이고 오른쪽 자식은 2i+12i + 1번 정점이다. 대학원에 다니는 산지니는 TT에 공을 굴려 정점마다 공을 한 개씩 배치하려고 한다. 처음에 TT는 비어있으며 공은 11번 정점에서 굴리기 시작한다. 산지니는 아래 규칙에 따라 공을 굴린다.

  1. 공이 위치한 현재 정점의 두 자식 정점이 존재하며 둘 중 하나라도 비어있다면 다음과 같은 규칙에 따라 자식 정점으로 공을 굴려 이동시킨다.

    • 만약 두 자식 정점 중 하나만 비어있는 경우 두 자식 정점 중 비어있는 정점으로 이동시킨다.
    • 만약 두 자식 정점이 모두 비어있는 경우 두 자식 정점을 루트로 하는 두 서브트리 중 공이 더 적은 쪽으로 굴려 이동시킨다. 만약 두 서브트리의 공의 개수가 동일한 경우 현재 정점의 번호가 홀수이면 오른쪽 자식 정점으로 이동시키고 짝수이면 왼쪽 자식 정점으로 이동시킨다.
  2. 현재 정점에서 공을 더 이상 굴릴 수 없다면 현재 공을 굴리는 것을 멈춘다.

  3. 11번 공부터 2N−12^{N}-1번 공까지 순서대로 트리의 모든 정점에 공이 찰 때까지 공을 굴린다.

산지니는 시간이 없어 공을 직접 굴리지 않고 2N−12^{N}-1개의 공 중 QQ개의 공이 도착하는 정점의 번호만 구하려고 한다. QQ개의 공의 번호가 주어질 때, 각 공이 도착하는 정점의 번호를 구해보자!

입력

첫 번째 줄에 트리의 깊이를 나타내는 정수 NN이 주어진다. (1≤N≤60)(1 \leq N \leq 60)

두 번째 줄에 산지니가 번호를 구해야 하는 공의 개수를 나타내는 정수 QQ가 주어진다. (1≤Q≤min⁡(2N−1,105))(1 \leq Q \leq \min(2^{N} - 1, 10^5))

세 번째 줄부터 Q+2Q + 2번째 줄까지 한 줄에 하나씩 공의 번호를 나타내는 정수 KK가 주어진다. (1≤K≤2N−1)(1 \leq K \leq 2^{N} - 1)

출력

공의 번호가 주어질 때마다 공이 멈추는 정점의 번호를 한 줄에 하나씩 출력한다.

힌트

입출력의 양이 많으므로, 빠른 입출력을 사용하는 것을 권장합니다. 대표적인 언어에 따른 빠른 입출력은 아래를 참고하세요.

  • C++: cin, cout을 사용하는 경우 입출력 전에 cin.tie(nullptr); ios::sync_with_stdio(false);를 한 번 적용해야 합니다. 줄 바꿈할 때는 endl 대신 '\n'을 사용해야 합니다.
  • Java: BufferedReader와 BufferedWriter를 사용해야 합니다.
  • Python3, PyPy3: input() 대신 sys.stdin.readline().rstrip()을 사용해야 합니다.

예제3

  1. 예제 1

    입력
    1
    1
    1
    
    예상 출력
    1
    
  2. 예제 2

    입력
    2
    3
    1
    3
    2
    
    예상 출력
    3
    1
    2
    
  3. 예제 3

    입력
    3
    3
    1
    6
    7
    
    예상 출력
    7
    2
    1