만드는 중입니다

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

힐베르트 호텔

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

요약
손님이 유한 개 또는 무한히 도착하는 힐베르트 호텔을 처리하면서, 어떤 방의 그룹 번호를 구하거나 특정 그룹의 x번째 방 번호를 답한다.
난이도

어려움10점 중 8점

유형
수학, 구현, 이분 탐색, 조합론
정답자
아직 제출이 없습니다

문제

힐베르트 호텔에는 0, 1, 2, ⋯\cdots번 방이 무한히 있다. 각 방에는 최대 한 명의 손님이 묵는다. 사람들은 보통 단체로 체크인하는 경향이 있어서, 호텔에는 단체 번호를 관리하는 변수 GG가 있다.

힐베르트 호텔은 오늘 개업했다. 곧바로 무한히 많은 사람이 한꺼번에 도착해 호텔의 모든 방이 찼다. 모든 손님은 단체 번호 0을 받았고, GG는 1로 설정되었다.

아이러니하게도 모든 방이 찼는데도 호텔은 손님을 더 받을 수 있다.

  • kk (k≥1k \geq 1)명의 사람이 호텔에 도착하면, 각 방 번호 xx에 대해 xx번 방의 손님이 x+kx+k번 방으로 옮긴다. 그 뒤 새로 온 손님들이 0번부터 k−1k-1번 방을 모두 채운다.
  • 무한히 많은 사람이 호텔에 도착하면, 각 방 번호 xx에 대해 xx번 방의 손님이 2x2x번 방으로 옮긴다. 그 뒤 새로 온 손님들이 홀수 번호 방을 모두 채운다.

다음 질의를 처리하는 프로그램을 작성해야 한다.

  • 1 k - k≥1k \geq 1이면 kk명의 사람이 호텔에 도착한다. k=0k = 0이면 무한히 많은 사람이 도착한다. 새로 온 손님들에게 단체 번호 GG를 부여하고, GG를 1 증가시킨다.
  • 2 g x - 단체 번호 gg인 손님이 묵는 방 번호 중 xx번째로 작은 것을 찾는다. 그 값을 109+710^9 + 7로 나눈 나머지를 출력하고 줄바꿈한다.
  • 3 x - xx번 방에 묵는 손님의 단체 번호를 출력하고 줄바꿈한다.

입력

첫째 줄에 질의의 수를 나타내는 정수 QQ (1≤Q≤300 0001 \leq Q \leq 300\,000)가 주어진다. 다음 QQ개 줄에 각각 질의가 주어진다. 질의에 나오는 모든 수는 정수다.

  • 1 k 질의에서 0≤k≤1090 \leq k \leq 10^9이다.
  • 2 g x 질의에서 g<Gg < G이고 1≤x≤1091 \leq x \leq 10^9이며, 단체 번호 gg인 손님이 xx명 이상 있다.
  • 3 x 질의에서 0≤x≤1090 \leq x \leq 10^9이다.

출력

모든 질의를 처리하고 요구대로 출력한다. 출력이 비어 있지 않음이 보장된다.

힌트

"기수"에 대해 알고 있다면 "무한"은 "가산 무한"만을 가리킨다고 가정하자. 모른다면 걱정할 필요 없다.

예제1

  1. 예제 1

    입력
    10
    3 0
    1 3
    2 1 2
    1 0
    3 10
    2 2 5
    1 5
    1 0
    3 5
    2 3 3
    
    예상 출력
    0
    1
    0
    9
    4
    4