만드는 중입니다

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

트리 방문

시간 제한5초메모리 제한1536 MB

요약
2^C 단위로 2^N 모듈로 증가하는 X에 따라 루트에서 리프까지 지나는 모든 노드를 방문 표시하고, 지금까지 방문한 서로 다른 노드 수를 출력한다.
난이도

보통10점 중 7점

유형
트리, 비트 연산, 누적 합, 구현
정답자
아직 제출이 없습니다

문제

높이가 NN인 포화 이진 트리가 하나 있다. 즉 노드는 모두 2N+1−12^{N+1}-1개이고, 깊이 NN인 리프 노드는 2N2^N개다.

길이가 NN인 이진수 XX로 트리를 따라 내려간다. XX의 가장 왼쪽 비트부터 차례대로 보면서 비트가 0이면 왼쪽 자식으로, 1이면 오른쪽 자식으로 내려간다. 예를 들어 N=2N = 2일 때 X=0=002X = 0 = 00_2이면 가장 왼쪽 리프 노드까지 내려가고, X=3=112X = 3 = 11_2이면 가장 오른쪽 리프 노드까지 내려간다. X=2=102X = 2 = 10_2이면 루트에서 오른쪽 자식으로 내려간 다음 왼쪽 자식으로 내려간다.

가장 처음에 X=0X = 0이고, 루트만 방문한 상태다. 다음 두 쿼리를 처리하는 프로그램을 작성하시오.

  • 1 C: XX를 (X+2C) mod 2N(X + 2^C) \bmod 2^N으로 바꾼다. 그 다음 바뀐 XX로 루트에서부터 내려가면서 지나가는 노드를 모두 방문한다. 루트와 도착한 리프 노드도 방문한 노드에 포함된다.
  • 2: 지금까지 방문한 서로 다른 노드의 개수를 출력한다. 같은 노드를 여러 번 방문해도 한 번만 센다.

입력

첫째 줄에 트리의 높이 NN과 쿼리의 개수 QQ가 주어진다. (1≤N,Q≤1051 \le N, Q \le 10^5)

둘째 줄부터 QQ개의 줄에 쿼리가 한 줄에 하나씩 주어진다. 1번 쿼리는 1 C 꼴이고 0≤C<N0 \le C < N이다. 2번 쿼리는 2 한 글자로 주어지고, 적어도 하나 주어진다.

출력

2번 쿼리마다 방문한 서로 다른 노드의 개수를 한 줄에 하나씩 출력한다.

예제2

  1. 예제 1

    입력
    2 9
    1 0
    2
    1 1
    2
    1 0
    2
    1 0
    1 0
    2
    
    예상 출력
    3
    5
    6
    7
    
  2. 예제 2

    입력
    1 5
    2
    1 0
    2
    1 0
    2
    
    예상 출력
    1
    2
    3