트리 방문

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

보통7트리비트 연산누적 합구현아직 제출이 없습니다시간 제한5초메모리 제한1536 MB

문제

높이가 NN인 포화 이진 트리가 하나 있다. 즉 노드는 모두 2N+112^{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)mod2N(X + 2^C) \bmod 2^N으로 바꾼다. 그 다음 바뀐 XX로 루트에서부터 내려가면서 지나가는 노드를 모두 방문한다. 루트와 도착한 리프 노드도 방문한 노드에 포함된다.
  • 2: 지금까지 방문한 서로 다른 노드의 개수를 출력한다. 같은 노드를 여러 번 방문해도 한 번만 센다.

입력

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

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

출력

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