60002 허수아비 Gold III

시간 제한: 2초 메모리 제한: 2048MB

문제

수직선의 위치 00에서 오른쪽 방향으로 힘 PP를 가진 화살이 발사된다. 각 정수 위치 ii (1iN1 ≤ i ≤ N)에는 방어력 AiA_i를 가진 허수아비를 최대 하나 설치할 수 있다. 화살이 허수아비에 부딪치면, 화살의 힘이 방어력보다 작거나 같을 경우 화살은 즉시 멈춘다. 반대로 화살의 힘이 방어력보다 크면, 화살의 힘은 현재 화살의 힘에서 AiA_i만큼 줄어든 채 계속 진행한다.

정수 ii에 대하여 f(i)f(i)의 값을 “화살이 위치 ii에서 멈추거나 위치 ii보다 왼쪽에서 멈추도록 하기 위해 필요한 허수아비의 최소 개수” 라고 정의하자. 화살을 멈추게 할 수 있는 방법이 없을 때의 값은 1−1이다.

예를 들어서 N=5N = 5, P=10P = 10이고 A1=3A_1 = 3, A2=6A_2 = 6, A3=1A_3 = 1, A4=1A_4 = 1, A5=10A_5 = 10이라고 하자. 모든 f(i)f(i)의 값과 설치한 허수아비의 위치는 다음과 같다.

iif(i)f(i)의 값설치한 허수아비의 위치
i=1i = 11-1불가능
i=2i = 21-1불가능
i=3i = 333[1,2,3][1, 2, 3]
i=4i = 433[1,2,3][1, 2, 3] 혹은 [1,2,4][1, 2, 4] 중 하나 선택 가능
i=5i = 511[5][5]

1iN1 ≤ i ≤ N인 모든 ii에 대하여 f(i)f(i)의 값을 구하는 프로그램을 작성하라.

입력

첫 번째 줄에 정수 NN과 화살의 힘 PP가 공백을 사이에 두고 주어진다.

두 번째 줄에 NN개의 정수 A1,A2,,ANA_1 , A_2 ,\cdots, A_N이 공백을 사이에 두고 주어진다.

출력

첫 번째 줄에 f(1),f(2),,f(N)f(1), f(2), \cdots , f(N)의 값을 공백을 사이에 두고 출력한다.

제한

  • 주어지는 모든 수는 정수이다.
  • 1N5000001 ≤ N ≤ 500\, 000
  • 1P1091 ≤ P ≤ 10^9
  • 1iN1 ≤ i ≤ N인 모든 ii에 대하여 1Ai1091 ≤ A_i ≤ 10^9

서브태스크

번호배점제한
14N8N ≤ 8
28N5000N ≤ 5\, 000
381iN1 ≤ i ≤ N인 모든 ii에 대하여 Ai=1A_i = 1
4201iN1 ≤ i ≤ N인 모든 ii에 대하여 Ai=2A_i = 2 또는 Ai=3A_i = 3
5401iN1 ≤ i ≤ N인 모든 ii에 대하여 Ai50A_i ≤ 50
6401i<N1 ≤ i < N인 모든 ii에 대하여 AiAi+1A_i \le A_{i+1}
730추가 제약 조건 없음.

예제 입출력

예제 입력 1
5 10
3 6 1 1 10
예제 출력 1
-1 -1 3 3 1
예제 입력 2
3 10
20 20 20
예제 출력 2
1 1 1
예제 입력 3
1 5
3
예제 출력 3
-1

출처

올림피아드 한국정보올림피아드 KOI 2025 1차 초등부 3번
solution.cpp
에디터 불러오는 중...