수열과 개구리

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

요약
각 시작 위치에서 개구리가 b_x초를 기다린 뒤 x±a_x로 이동할 때, 수열 밖으로 나가는 최초 시각 f(x)를 모두 구한다.
난이도

어려움10점 중 8점

유형
그래프, 최단 경로, 그리디, 구현
정답자
아직 제출이 없습니다

문제

길이가 nn이고 양의 정수로 구성된 수열 aa와 bb가 있습니다. 두 수열의 인덱스는 11부터 시작합니다.

이 수열 위에 개구리 한 마리가 있습니다. 개구리는 초기에 어떤 정수 위치 1≤x≤n1 \le x \le n에서 출발하며, 자신의 위치가 수열 밖†^\dagger이 될 때까지 다음을 반복합니다.

  • b_xb\_x초 동안 기다린 뒤, 위치 x−a_xx-a\_x로 이동하거나 위치 x+a_xx+a\_x로 이동합니다. 이때 이동한 위치가 xx의 새로운 값이 됩니다.

개구리가 시작하는 위치 xx에 대해, 개구리의 위치가 수열 밖이 될 수 있는 최초의 시각을 f(x)f(x)초라고 정의할 때, 여러분은 f(1),f(2),⋯ ,f(n)f(1),f(2),\cdots,f(n)의 값을 모두 구해야 합니다.

†^\dagger 어떤 위치 xx에 대해서, 1≤x≤n1 \le x \le n이면 수열 안, x<1x<1 또는 x>nx>n이면 수열 밖이라고 부릅니다.

입력

첫 번째 줄에 두 수열의 길이 nn이 주어집니다. (1≤n≤2⋅1051 \le n \le 2 \cdot 10^5)

두 번째 줄에 nn개의 정수 a_1,a_2,…,a_na\_1,a\_2,\dots,a\_n이 공백으로 구분되어 주어집니다. (1≤a_i≤n1 \le a\_i \le n)

세 번째 줄에 nn개의 정수 b_1,b_2,…,b_nb\_1,b\_2,\dots,b\_n이 공백으로 구분되어 주어집니다. (1≤b_i≤1061 \le b\_i \le 10^6)

출력

한 줄에 f(1),f(2),⋯ ,f(n)f(1),f(2),\cdots,f(n)의 값을 공백으로 구분하여 순서대로 출력합니다.

문제의 제한에 따라 모든 1≤i≤n1 \le i \le n에 대해 f(i)f(i)가 유한함을 증명할 수 있습니다.

힌트

출력이 32비트 정수의 최댓값을 초과할 수 있음에 유의하세요. 값을 저장하기 위해 다음을 사용할 것을 권장합니다.

  • C/C++: long long
  • Java: long
  • Python: int (별도의 처리를 할 필요가 없습니다.)
  • 이외의 언어: 언어별 레퍼런스를 참고합니다.

예제1

  1. 예제 1

    입력
    5
    3 4 2 5 1
    2 5 1 4 3
    
    예상 출력
    2 5 3 4 3