바이트아사르는 텍스트 편집기를 만들고 있다. 편집기의 연산은 두 종류다. 하나는 텍스트를 고치는 편집 연산이고, 다른 하나는 앞서 수행한 연산을 취소하는 되돌리기 연산이다. 이 편집기의 되돌리기는 여러 단계로 동작한다.
편집 연산은 레벨 0인 연산이다. 레벨 i(i=1,2,…)의 되돌리기 연산은 아직 취소되지 않은 연산 중에서 레벨이 i−1 이하인 가장 최근 연산을 취소한다. 그래서 레벨 1의 되돌리기는 편집 연산만 취소하고, 레벨 2의 되돌리기는 편집 연산과 레벨 1의 되돌리기 연산을 취소하지만 그보다 높은 레벨의 되돌리기 연산은 취소하지 못한다.
좀 더 엄밀하게 쓰면, 이미 수행한 각 연산은 활성 상태이거나 취소 상태다. 연산 X를 수행한 직후 X는 활성 상태다. X가 레벨 i의 되돌리기 연산이면 레벨이 i−1 이하인 활성 연산 중 가장 최근 것을 X1이라 하고, X1을 취소 상태로 바꾼다. X1도 되돌리기 연산이라면 X1이 취소했던 연산 X2의 상태를 다시 활성으로 바꾼다. 이 규칙은 계속 이어진다. 되돌리기 연산 Xj의 상태가 바뀌면 Xj가 취소했던 연산 Xj+1의 상태도 함께 바뀐다. 편집 연산에 이르면 상태 변경의 연쇄가 끝난다.
편집기의 현재 내용은 정수 s 하나로 나타내고, 이 값을 편집기 상태라고 한다. 처음 편집기 상태는 0이다. 편집 연산은 자신이 만들어 낼 편집기 상태를 지정한다. 현재 편집기 상태는 활성 상태인 가장 최근 편집 연산의 값이고, 활성 편집 연산이 하나도 없으면 0이다.
아래 표는 연산을 차례로 수행했을 때의 편집기 상태를 보여 준다. Es는 편집기 상태를 s로 바꾸는 편집 연산이고, Ui는 레벨 i의 되돌리기 연산이다.
| 연산 | E1 | E2 | E5 | U1 | U1 | U3 | E4 | U2 | U1 | U1 | E1 | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 편집기 상태 | 0 | 1 | 2 | 5 | 2 | 1 | 2 | 4 | 2 | 1 | 0 | 1 |
바이트아사르는 먼저 편집 연산을 세 번 수행해 상태를 0에서 1, 2, 5로 바꿨다. 이어진 레벨 1의 되돌리기 두 번이 E5와 E2를 취소해 상태가 1로 돌아갔다. 그다음 레벨 3의 되돌리기가 마지막 U1을 취소했고, 그 결과 E2가 다시 활성이 되어 상태가 2가 됐다. U2는 E4를 취소했고, 다음 U1은 되살아난 E2를 다시 취소했으며, 마지막 U1은 E1을 취소했다. 마지막 연산은 상태를 1로 바꾸는 편집 연산이다.
각 연산을 수행한 뒤의 편집기 상태를 모두 구하는 프로그램을 작성하라.
첫 줄에 바이트아사르가 수행한 연산의 개수 n(1≤n≤500000)이 주어진다.
다음 n개 줄에 연산을 나타내는 정수 ai(−n≤ai≤n, ai=0)가 한 줄에 하나씩 주어진다. ai>0이면 편집기 상태를 ai로 바꾸는 편집 연산이고, ai<0이면 레벨 −ai의 되돌리기 연산이다. 모든 되돌리기 연산에는 취소할 대상, 곧 레벨이 더 작은 활성 연산이 항상 존재한다.
n개 줄을 출력한다. i번째 줄에는 입력의 처음 i개 연산을 수행한 뒤의 편집기 상태를 출력한다.