#include<stdio.h> int N, x, data[200010], cnt, ans[100001], anscnt; void in() { int pos, tmp; data[++cnt] = x; pos = cnt / 2; while (pos != 0) { if (data[pos]>data[pos * 2] && (data[pos * 2]<data[pos * 2 + 1] || data[pos * 2 + 1] == 0)) { tmp = data[pos * 2]; data[pos * 2] = data[pos]; data[pos] = tmp; } else if (data[pos]>data[pos * 2 + 1] && data[pos * 2 + 1] != 0) { tmp = data[pos * 2 + 1]; data[pos * 2 + 1] = data[pos]; data[pos] = tmp; } else { return; } pos /= 2; } } void out() { int pos = 1, tmp; if (cnt == 0) { ans[++anscnt] = 0; } else { ans[++anscnt] = data[1]; data[1] = data[cnt]; data[cnt--] = 0; while (data[pos * 2] != 0) { if (data[pos]>data[pos * 2] && (data[pos * 2]<data[pos * 2 + 1] || data[pos * 2 + 1] == 0)) { tmp = data[pos]; data[pos] = data[pos * 2]; data[pos * 2] = tmp; pos *= 2; } else if (data[pos]>data[pos * 2 + 1] && data[pos * 2 + 1] != 0) { tmp = data[pos]; data[pos] = data[pos * 2 + 1]; data[pos * 2 + 1] = tmp; pos = pos * 2 + 1; } else { return; } } } } int main() { int i; scanf("%d", &N); for (i = 1; i <= N; i++) { scanf("%d", &x); if (x == 0) { out(); } else { in(); } } for (i = 1; i <= anscnt; i++) { printf("%d\n", ans[i]); } return 0; }
1927번: 최소 힙
https://www.acmicpc.net/problem/1927
피드 구독하기:
댓글
(
Atom
)
댓글 없음 :
댓글 쓰기