첫째 줄에 수열 원소의 개수 (1 ≤ N ≤100,000)이 주어진다. 그리고 두 번째 줄부터 N+1 번째 줄까지 차례로 A[i]가 주어진다.
출력
N개의 줄에 걸쳐서 수열을 출력한다. (i번째 줄에는 i번째 원소를 의미한다)
입력 예시
8
5
0
1
2
1
2
0
0
출력 예시
2
7
3
5
4
1
8
6
풀이
i번째 수에 대해 A[i]가 주어졌다면, 아직 배정되지 않은 자리들 중 A[i]+1번째에 i번째 수가 위치할 수 있다. 즉 아직 배정되지 않은 자리를 빠르게 구할 수 있어야 한다는 전제가 붙는다. 이러한 탐색에 O(logN)이 소요되는 이분 탐색, 혹은 세그먼트 트리를 사용해보자.
지금 이 문제에 주어진 시간제한은 0.5초. 기존 풀이코드는 재귀식으로 세그먼트 트리의 search와 update를 사용하였기에 필히 시간초과를 겪을 수밖에 없다. (python의 함수 호출은 상상 이상으로 느리다) 즉 재귀 형태로 정의된 함수들을 반복문 형태로 바꾸어 주어야 한다. 세그먼트 트리의 search가 구간합이 아닌 k+1번째 합을 구하는 경우이므로 이분 탐색 문제로 바꿀 수 있으며, update 시 단일 노드와 그 노드의 직접적인 조상 노드들에만 영향을 끼친다는 사실을 눈여겨 보자. start, end를 이분 탐색 문제처럼 초기화하고 조건에 맞을 때까지 update하기만 하면 된다.