만드는 중입니다

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

GCD와 K번째 쿼리

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

요약
길이 N의 양의 정수 수열에서 구간 [L, R] 안의 모든 부분 배열 gcd 값을 정렬했을 때 K번째 값을 구합니다.
난이도

어려움10점 중 9점

유형
이분 탐색, 정수론, 분할 정복
정답자
아직 제출이 없습니다

문제

길이가 NN인 양의 정수 수열 A1,A2,…,ANA_1, A_2, \dots, A_N이 주어진다. 다음 쿼리를 처리하는 프로그램을 작성하시오.

  • LL RR KK: L≤i≤j≤RL \leq i \leq j \leq R을 만족하는 모든 순서쌍 (i,j)(i, j)에 대해 gcd⁡(Ai,Ai+1,…,Aj)\gcd(A_i, A_{i+1}, \dots, A_j)를 구한다. 이 값들을 비내림차순으로 정렬했을 때 KK번째로 나오는 수를 출력한다.

단, gcd⁡(Ai)=Ai\gcd(A_i) = A_i로 정의한다.

길이가 33인 수열 (1,2,4)(1, 2, 4)에서 L=1L = 1, R=3R = 3일 때 나올 수 있는 gcd⁡\gcd값은 (1,1,1,2,2,4)(1, 1, 1, 2, 2, 4)이다. 이때 K=4K=4라면 22를 출력한다.

입력

첫째 줄에 수열의 길이 NN이 주어진다. (1≤N≤200001 \leq N \leq 20000)

둘째 줄에 NN개의 정수 A1,A2,…,ANA_1, A_2, \dots, A_N이 공백으로 구분되어 주어진다. (1≤Ai≤5000001 \leq A_i \leq 500000)

셋째 줄에 쿼리의 개수 QQ가 주어진다. (1≤Q≤1000001 \leq Q \leq 100000)

넷째 줄부터 QQ개의 줄에 걸쳐 쿼리 LL, RR, KK가 한 줄에 하나씩 주어진다. (1≤L≤R≤N1 \leq L \leq R \leq N, 1≤K≤(R−L+1)(R−L+2)/21 \leq K \leq (R-L+1)(R-L+2)/2)

출력

쿼리의 결과를 한 줄에 하나씩 출력한다.

예제1

  1. 예제 1

    입력
    8
    1 2 4 8 72 27 9 3
    10
    1 1 1
    2 2 1
    1 2 3
    2 7 3
    2 7 10
    2 7 15
    2 7 21
    1 8 1
    1 8 18
    1 8 36
    
    예상 출력
    1
    2
    2
    1
    2
    8
    72
    1
    2
    72