나무 키우기

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

요약
현제는 매일 가장 낮은 나무를 하나 골라 높이를 2배로 만든다. X일이 지난 뒤 K번째로 낮은 나무의 높이를 10^9+7로 나눈 나머지를 구한다.
난이도

어려움10점 중 9점

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

문제

현제는 일렬로 심어져 있는 NN개의 나무를 키운다. 초기 각 나무의 높이는 왼쪽에서부터 각각 A_1A\_1, A_2A\_2, ⋯\cdots, A_NA\_N이다.

현제는 첫 번째 날부터 매일 가장 높이가 작은 나무를 하나 골라 물을 줘서 나무의 높이를 22배로 만든다. 만약 높이가 가장 작은 나무가 22개 이상이라면, 가장 왼쪽에 있는 나무에 물을 준다.

이때 아래의 쿼리를 수행하는 프로그램을 작성하여라.

  • XX KK: XX번째 날까지 물을 주고 난 후, KK번째로 작은 나무의 높이를 109+710^9+7로 나눈 나머지를 구한다.

입력

첫 번째 줄에 나무의 수 NN이 주어진다. (1≤N≤300,0001\le N\le 300\\,000)

다음 줄에 나무의 높이 A_1A\_1, A_2A\_2, ⋯\cdots, A_NA\_N이 공백을 사이에 두고 주어진다. (1≤A_i≤300,0001\le A\_i\le 300\\,000)

다음 줄에 쿼리의 수 QQ가 주어진다. (1≤Q≤300,0001\le Q\le 300\\,000)

그 후 QQ개의 줄에 쿼리의 정보 XX, KK가 공백을 사이에 두고 주어진다. (1≤X≤1091\le X\le 10^9; 1≤K≤N1\le K\le N)

모든 입력은 정수이다.

출력

QQ개의 줄에 쿼리의 정답을 차례대로 한 줄에 하나씩 출력한다.

예제1

  1. 예제 1

    입력
    5
    3 6 4 2 7
    10
    1 1
    2 2
    3 3
    4 4
    10 5
    5 5
    6 1
    7 2
    8 3
    9 4
    
    예상 출력
    3
    4
    6
    8
    24
    12
    7
    8
    12
    16