만드는 중입니다

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

공 굴리기

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

요약
깊이 N인 완전 이진 트리에서 공을 순서대로 굴릴 때, 주어진 Q개 공이 멈추는 정점 번호를 구합니다.
난이도

보통10점 중 7점

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

문제

트리 TT는 깊이가 NN이고 정점이 2N−12^{N}-1개인 포화 이진트리이며, 루트의 번호는 11이다. ii (1≤i≤2N−1−11 \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≤601 \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−11 \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