수열과 쿼리 14

시간 제한5초메모리 제한1536 MB

요약
부분 배열마다 서로 다른 값들만 모아 정렬했을 때 k번째로 작은 값을 출력하며, 각 질의의 범위는 직전 답에 따라 정해진다.
난이도

어려움10점 중 8점

유형
배열, 정렬, 이분 탐색, 누적 합
정답자
아직 제출이 없습니다

문제

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

  • l r k: Al,Al+1,…,ArA_l, A_{l+1}, \dots, A_r에 나타나는 서로 다른 값을 오름차순으로 정렬했을 때 kk번째 값을 출력한다. 그런 값이 없으면 −1-1을 출력한다.

수열의 인덱스는 1부터 시작한다.

입력

첫째 줄에 수열의 크기 NN이 주어진다. (1≤N≤1051 \le N \le 10^5)

둘째 줄에 A1,A2,…,ANA_1, A_2, \dots, A_N이 주어진다. (1≤Ai≤1091 \le A_i \le 10^9)

셋째 줄에 쿼리의 개수 MM이 주어진다. (1≤M≤1051 \le M \le 10^5)

넷째 줄부터 MM개의 줄에 쿼리를 만드는 값이 주어진다. 각 줄에는 aia_i, bib_i, cic_i, did_i, kik_i가 순서대로 주어진다. (0≤ai,bi,ci,di≤N0 \le a_i, b_i, c_i, d_i \le N, 1≤ki≤N1 \le k_i \le N)

ii번째 쿼리의 lil_i와 rir_i는 직전 쿼리의 정답으로 정한다. i−1i-1번째 쿼리의 정답을 ansi−1ans_{i-1}이라고 하고, ans0=0ans_0 = 0이라고 한다.

li=(ai×max⁡(ansi−1,0)+bi) mod N+1l_i = (a_i \times \max(ans_{i-1}, 0) + b_i) \bmod N + 1

ri=(ci×max⁡(ansi−1,0)+di) mod N+1r_i = (c_i \times \max(ans_{i-1}, 0) + d_i) \bmod N + 1

li>ril_i > r_i이면 lil_i와 rir_i를 서로 바꾼다.

출력

각 쿼리의 정답을 입력 순서대로 한 줄에 하나씩 출력한다.

예제2

  1. 예제 1

    입력
    4
    3 2 1 2
    4
    0 1 0 3 2
    2 0 0 3 4
    1 2 1 3 2
    2 0 0 3 3
    
    예상 출력
    2
    -1
    2
    3
    
  2. 예제 2

    입력
    10
    9 10 6 3 8 4 9 6 4 10
    10
    0 2 0 9 3
    1 9 1 3 3
    1 8 1 0 3
    1 2 1 7 2
    1 6 1 2 3
    1 4 1 3 1
    1 6 1 6 1
    1 4 1 8 1
    1 9 1 3 3
    1 9 1 2 1
    
    예상 출력
    6
    9
    10
    4
    6
    3
    10
    4
    6
    4