┌─ 소리 ─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
┌─ 프로그램 ─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
├─ 재생 ─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┤
├─ 조작 ─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┤
import heapq
defpush(queue, value):
heapq.heappush(queue,-value)defpop(queue):return-heapq.heappop(queue)defpeek(queue):return-queue[0]defrun(stream):
queue =[]
served =[]for value in stream:if value >0:push(queue, value)elif queue:
served.append(pop(queue))return served
classPriorityQueue{
heap =[];peek(){returnthis.heap[0];}push(value){const heap =this.heap;
heap.push(value);let at = heap.length -1;while(at >0){const parent =(at -1)>>1;if(heap[parent]>= heap[at])return;[heap[parent], heap[at]]=[heap[at], heap[parent]];
at = parent;}}pop(){const heap =this.heap;const top = heap[0];const last = heap.pop();if(heap.length ===0)return top;
heap[0]= last;let at =0;for(;;){let child =2* at +1;if(child >= heap.length)return top;if(child +1< heap.length && heap[child]< heap[child +1]) child++;if(heap[at]>= heap[child])return top;[heap[at], heap[child]]=[heap[child], heap[at]];
at = child;}}}functionrun(stream){const queue =newPriorityQueue();const served =[];for(const value of stream){if(value >0) queue.push(value);elseif(queue.heap.length >0) served.push(queue.pop());}return served;}
typedefstruct{int*slot;int size;}Queue;voidpq_push(Queue*q,int value){int at = q->size++;
q->slot[at]= value;while(at >0){int parent =(at -1)/2;int keep;if(q->slot[parent]>= q->slot[at])return;
keep = q->slot[parent];
q->slot[parent]= q->slot[at];
q->slot[at]= keep;
at = parent;}}intpq_peek(constQueue*q){return q->slot[0];}intpq_pop(Queue*q){int top = q->slot[0];int at =0;
q->slot[0]= q->slot[--q->size];for(;;){int child =2* at +1;int keep;if(child >= q->size)return top;if(child +1< q->size && q->slot[child]< q->slot[child +1]) child++;if(q->slot[at]>= q->slot[child])return top;
keep = q->slot[at];
q->slot[at]= q->slot[child];
q->slot[child]= keep;
at = child;}}