완전 이진 트리와 쿼리

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

요약
부모가 floor(x/2)인 완전 이진 트리에서 루트를 바꾸고, 주어진 정점을 루트로 하는 서브트리의 정점 번호 합을 구한다.
난이도

어려움10점 중 8점

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

문제

NN개의 정점을 가진 완전 이진 트리가 있다. 초기에는 11번 정점이 루트이다. 11번 정점을 제외한 모든 정점에 대해, xx번 정점은 ⌊x2⌋\lfloor \frac x2 \rfloor번 정점을 부모로 가진다.

이 트리에서 다음과 같은 쿼리를 처리해 보자.

  • 1 v: 트리의 루트를 vv번 정점으로 바꾼다.
  • 2 v: 현재 트리에서 vv번 정점을 루트로 하는 서브트리에 속한 모든 정점 번호의 합을 출력한다.

입력

첫 번째 줄에 NN, QQ가 공백으로 구분되어 주어진다. (1≤N≤1,000,000,0001 \le N \le 1\\,000\\,000\\,000; 1≤Q≤50,0001 \le Q \le 50\\,000)

이어서 QQ개의 줄에 걸쳐, 각 쿼리가 주어진다. 2번 쿼리가 최소 하나 이상 주어진다. (1≤v≤N1 \le v \le N)

출력

2번 쿼리가 입력될 때마다, 쿼리의 답을 한 줄에 하나씩 출력한다.

예제1

  1. 예제 1

    입력
    10 5
    2 3
    2 5
    1 8
    2 4
    2 1
    
    예상 출력
    16
    15
    47
    17