累堆是一種可以用來重覆選取一個集合中的最小元素的資料結構,它的實作方法如下:假設累堆的資料被排放在一個叫 heap 的陣列之中(從 1 開始),而累堆的大小則記錄在一個稱為 size 的整數變數中(它的初始值為 0),則把資料 element 插入累堆的演算法如下:
insert(element)
size = size+1
pointer = size
heap[pointer] = element
while (pointer>1) AND (heap[pointer/2]>heap[pointer])
swap(heap[pointer/2], heap[pointer])
pointer = pointer/2
end
end
註: pointer/2 為無條件捨去
在這裡我們假設所有被插入的累堆的資料都是唯一而不會重覆的。由於累堆本身必須滿足一些結構上的特性(它必須是一顆完全樹,而且每個節點的大小一定要小於它的左子樹和右子樹中的所有元素),因此用不同的順序插入一堆數字還是有可能會產生相同結構的累堆。以下是一個簡單的例子:
insert 1, 2, 3 à heap[1..3] = {1, 2, 3}
insert 2, 1, 3 à heap[1..3] = {1, 2, 3}
我們可以很輕易的驗證用這兩種不同順序來把這三個數字插入累堆的確可以得到相同的結果。在這裡,我們希望你能寫一個程式來求得能夠得到相同累堆結構而字典順序最大的數字插入順序。給定兩個不同數字序列 A, B 字典順序的定義如下:
1.若 A 的第一個數字比 B 的第一個數字小,則 A<B
2.若 B 的第一個數字比 A 的第一個數字小,則 B<A
3.若 A 和 B 的第一個數字一樣大,則繼續比較下一個數字
4.依此原則持續操作,直到能決定順序為止
輸入檔說明
輸入的資料中可以包含一組以上的插入順序資訊。每一組資訊佔一行的大小,由數字 N 開始 (1<=N<=63) 代表要插入的數列的長度,接下來的 N 的數字為從 1 到 N 的某個特定數字排列。輸入資料的結尾是以 N=0 為結束(這一筆不合法的資料不必處理)。
輸出檔說明
對於每一筆輸入資料,請在單獨一行中輸出在插入累堆時可以得到和輸入資料插入累堆所得到相同結果,但是字典順序最大的數字排列。同一行的數字和數字之間應該以一個空白字元分隔開來。
範例輸入
3 1 2 3
3 1 3 2
0
範例輸出
2 1 3
3 2 1