아직 만들고 있는 페이지입니다.

이 페이지는 아직 만드는 중입니다. 보이는 내용은 바뀔 수 있습니다.

이진 삼진 탐색 놀이 2

시간 제한2초메모리 제한256 MB

요약
각 질의 N S E마다 S..E 구간에서 삼진 탐색의 탐색 횟수 합에서 이진 탐색의 탐색 횟수 합을 뺀 값을 구한다.
난이도

보통10점 중 7점

유형
분할 정복, 재귀, 누적 합, 구현
정답자
아직 제출이 없습니다

문제

서준이는 오늘도 아빠와 함께 알고리즘 놀이를 한다. 서준이는 이진 탐색, 아빠는 삼진 탐색을 한다.

서로 다른 정수가 오름차순으로 정렬된 크기 NN의 배열 AA가 있다. 이진 탐색과 삼진 탐색으로 배열 AA의 ii번째 원소 AiA_i를 찾을 때, AiA_i를 찾기 전에 참조하는 배열 AA의 원소 개수를 각각 BiB_i, TiT_i라고 하자. 서준이는 아빠로부터 [i,j][i, j] 구간에 대한 TT의 합에서 BB의 합을 뺀 값을 출력하는 QQ개의 질의를 받았다. NN과 QQ가 커서 괴로워하는 서준이를 도와주자.

크기 NN인 배열에서 이진 탐색 알고리즘의 의사 코드는 다음과 같다.

binary_search(A[0..N-1], value, left, right) {
    mid = (left + right) / 2
    if (A[mid] == value)
        return mid
    else if (value < A[mid])
        return binary_search(A, value, left, mid - 1)
    else
        return binary_search(A, value, mid + 1, right)
}

크기 NN인 배열에서 삼진 탐색 알고리즘의 의사 코드는 다음과 같다.

ternary_search(A[0..N-1], value, left, right) {
    left_third = left + (right - left) / 3
    right_third = right - (right - left) / 3
    if (A[left_third] == value) 
        return left_third
    else if (A[right_third] == value)
        return right_third
    else if (value < A[left_third])
        return ternary_search(A, value, left, left_third - 1)
    else if (value < A[right_third])
        return ternary_search(A, value, left_third + 1, right_third - 1)
    else
        return ternary_search(A, value, right_third + 1, right)
}

입력

첫째 줄에 질의의 수 Q(1≤Q≤500,000)Q(1 \le Q \le 500{,}000)가 주어진다. 둘째 줄부터 Q+1Q+1번째 줄까지 질의의 정보 NN SS EE가 주어진다. NN은 배열 AA의 원소 개수, SS는 구간의 시작, EE는 구간의 끝을 나타낸다.

출력

첫 번째 질의부터 QQ번째 질의까지 각 질의의 결과를 한 줄씩 출력한다.

제한

  • 1≤N≤5,0001 \le N \le 5{,}000
  • 1≤Q≤500,0001 \le Q \le 500{,}000
  • 0≤S≤E<N0 \le S \le E < N

예제1

  1. 예제 1

    입력
    1
    5 0 4
    
    예상 출력
    1