만드는 중입니다

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

나누고 지배하라 2.0

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

요약
서로 다른 값으로 이루어진 배열에서 각 질의의 구간 [l, r]에 있는 수 중 d의 약수이거나 d의 배수인 것의 개수를 구합니다.
난이도

어려움10점 중 8점

유형
정수론, 누적 합, 배열
정답자
아직 제출이 없습니다

문제

사슈카는 나눗셈 연산을 매우 좋아한다. 그래서 가을 정보 올림피아드에 나눗셈만 사용하는 문제를 내기로 했다. 문제에는 그가 아끼는 양의 정수 수열 a1,a2,…,aNa_1, a_2, \ldots, a_N과 QQ개의 질의가 주어진다. ii번째 질의는 양의 정수 lil_i, rir_i, did_i로 표현된다. 각 질의에 대해 수열에서 위치가 lil_i부터 rir_i까지인 원소 중 did_i의 약수이거나 did_i의 배수인 수의 개수를 구한다. 시간이 흐르고 있고 여러분은 1등을 원하므로, 이 질의에 답하는 프로그램 divide.cpp를 작성하라.

입력

첫 줄에 정수 NN과 QQ가 주어진다. 둘째 줄에 NN개의 정수 a1,a2,…,aNa_1, a_2, \ldots, a_N이 주어진다. 이어지는 QQ개의 줄에는 각각 lil_i, rir_i, did_i가 주어진다.

출력

한 줄에 QQ개의 정수를 출력한다. ii번째 정수는 ii번째 질의의 답이다.

제한

1≤N,Q≤1000001 ≤ N, Q ≤ 100000, 1≤ai,di≤2000001 ≤ a_i, d_i ≤ 200000, 1≤li≤ri≤N1 ≤ l_i ≤ r_i ≤ N. 모든 1≤i<j≤N1 ≤ i < j ≤ N에 대해 aieaja_i e a_j이다.

예제1

  1. 예제 1

    입력
    8 5
    12 10 3 18 6 72 28 42
    1 8 6
    3 7 7
    2 6 9
    1 5 5
    4 8 4
    
    예상 출력
    6 1 3 1 2