#include <stdio.h>
#include <stdlib.h>
#define height 4
#define MAX (1<<height) //ビットシフト演算 2^height と同じ
int t[MAX+1]; //配列外アクセス防止のためのダミーで+1
int sz = 0;
void swap(int *x, int *y){
int tmp = *x;
*x = *y;
*y = tmp;
}
void initTree(int n){
int i;
for(i=0;i<MAX;i++){
t[i] = -1;
}
}
void printA(){
int i;
for(i
=1;i
<=sz
;i
++) printf("%d ",t
[i
]); }
void printT(int i){
int x = i;
while(x/2!=0){
x/=2;
}
}
int goP(int i){
if(i/2 == 0) return 0;
else return i/2;
}
int goL(int i){
if(2*i >= MAX) return 0;
else return 2*i;
}
int goR(int i){
if(2*i+1 >= MAX) return 0;
else return 2*i+1;
}
void preOrder(int i){
if(t[i] == -1) return;
printT(i);
preOrder(goL(i));
preOrder(goR(i));
}
void inOrder(int i){
if(t[i] == -1) return;
inOrder(goL(i));
printT(i);
inOrder(goR(i));
}
void postOrder(int i){
if(t[i] == -1) return;
postOrder(goL(i));
postOrder(goR(i));
printT(i);
}
void insBT(int x){
int k,i = 1;
for(k=0;k<height;k++){
if(t[i]==-1){
t[i] = x;
sz++;
return;
}
if(x < t[i]) i = goL(i);
else i = goR(i);
}
printf("Error : too high -> %d\n",x
); }
//先頭の要素を取り出す
//ダウンヒープ
int popHeap(){
// 取り出して
// 末尾の要素を根に持ってきて
// 子のうちの大きい方と比較
// 子の方が大きかったら交換
// をHeapが完成するまで繰り返す
// 事前学習資料のP.56~60
if(sz == 0){
printf("Error : heap is empty\n"); return -1;
}
int ret = t[1];
t[1] = t[sz];
t[sz] = -1;
sz--;
int i = 1;
while(1){
int l = goL(i);
int r = goR(i);
int largest = i;
if(l != 0 && t[l] > t[largest]){
largest = l;
}
if(r != 0 && t[r] > t[largest]){
largest = r;
}
if(largest == i) break;
swap(&t[i], &t[largest]);
i = largest;
}
return ret;
}
//末尾に要素を追加する
//アップヒープ
void pushHeap(int x){
// 末尾に追加
// 親と比較して、子の方が大きかったら交換
// をHeapが完成するまで繰り返す
if(sz + 1 >= MAX){
printf("Error : heap overflow\n"); return;
}
sz++;
t[sz] = x;
int i = sz;
while(goP(i) != 0 && t[i] > t[goP(i)]){
swap(&t[i], &t[goP(i)]);
i = goP(i);
}
}
int main(void){
int i,x,n;
// 木の初期化
initTree(n);
for(i=0;i<n;i++){
}
sz = n;
// 中間順で表示
inOrder(1);
// pop
int a=popHeap();
inOrder(1);
a = popHeap();
inOrder(1);
pushHeap(100);
inOrder(1);
pushHeap(30);
inOrder(1);
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KIAojZGVmaW5lIGhlaWdodCA0CiNkZWZpbmUgTUFYICgxPDxoZWlnaHQpICAvL+ODk+ODg+ODiOOCt+ODleODiOa8lOeulyAyXmhlaWdodCDjgajlkIzjgZgKIAppbnQgdFtNQVgrMV07IC8v6YWN5YiX5aSW44Ki44Kv44K744K56Ziy5q2i44Gu44Gf44KB44Gu44OA44Of44O844Gn77yL77yRCmludCBzeiA9IDA7CiAKdm9pZCBzd2FwKGludCAqeCwgaW50ICp5KXsKICAgIGludCB0bXAgPSAqeDsKICAgICp4ID0gKnk7CiAgICAqeSA9IHRtcDsKfQogCnZvaWQgaW5pdFRyZWUoaW50IG4pewogICAgaW50IGk7CiAgICBmb3IoaT0wO2k8TUFYO2krKyl7CiAgICAgICAgdFtpXSA9IC0xOwogICAgfQp9CiAKdm9pZCBwcmludEEoKXsKICAgIGludCBpOwogICAgZm9yKGk9MTtpPD1zejtpKyspIHByaW50ZigiJWQgIix0W2ldKTsKICAgIHByaW50ZigiXG4iKTsKfQogCnZvaWQgcHJpbnRUKGludCBpKXsKICAgIGludCB4ID0gaTsKICAgIHdoaWxlKHgvMiE9MCl7CiAgICAgICAgcHJpbnRmKCIgICIpOwogICAgICAgIHgvPTI7CiAgICB9CiAgICBwcmludGYoIiVkXG4iLHRbaV0pOwp9CiAKaW50IGdvUChpbnQgaSl7CiAgICBpZihpLzIgPT0gMCkgcmV0dXJuIDA7CiAgICBlbHNlIHJldHVybiBpLzI7Cn0KIAppbnQgZ29MKGludCBpKXsKICAgIGlmKDIqaSA+PSBNQVgpIHJldHVybiAwOwogICAgZWxzZSByZXR1cm4gMippOwp9CiAKaW50IGdvUihpbnQgaSl7CiAgICBpZigyKmkrMSA+PSBNQVgpIHJldHVybiAwOwogICAgZWxzZSByZXR1cm4gMippKzE7Cn0KIAp2b2lkIHByZU9yZGVyKGludCBpKXsKICAgIGlmKHRbaV0gPT0gLTEpIHJldHVybjsKICAgIHByaW50VChpKTsKICAgIHByZU9yZGVyKGdvTChpKSk7CiAgICBwcmVPcmRlcihnb1IoaSkpOwp9CiAKdm9pZCBpbk9yZGVyKGludCBpKXsKICAgIGlmKHRbaV0gPT0gLTEpIHJldHVybjsKICAgIGluT3JkZXIoZ29MKGkpKTsKICAgIHByaW50VChpKTsKICAgIGluT3JkZXIoZ29SKGkpKTsKfQogCnZvaWQgcG9zdE9yZGVyKGludCBpKXsKICAgIGlmKHRbaV0gPT0gLTEpIHJldHVybjsKICAgIHBvc3RPcmRlcihnb0woaSkpOwogICAgcG9zdE9yZGVyKGdvUihpKSk7CiAgICBwcmludFQoaSk7Cn0KIAp2b2lkIGluc0JUKGludCB4KXsKICAgIGludCBrLGkgPSAxOwogICAgZm9yKGs9MDtrPGhlaWdodDtrKyspewogICAgICAgIGlmKHRbaV09PS0xKXsKICAgICAgICAgICAgdFtpXSA9IHg7CiAgICAgICAgICAgIHN6Kys7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgaWYoeCA8IHRbaV0pIGkgPSBnb0woaSk7CiAgICAgICAgZWxzZSBpID0gZ29SKGkpOwogICAgfQogICAgcHJpbnRmKCJFcnJvciA6IHRvbyBoaWdoIC0+ICVkXG4iLHgpOwp9CiAKLy/lhYjpoK3jga7opoHntKDjgpLlj5bjgorlh7rjgZkKLy/jg4Djgqbjg7Pjg5Ljg7zjg5cKaW50IHBvcEhlYXAoKXsKLy8g5Y+W44KK5Ye644GX44GmCi8vIOacq+WwvuOBruimgee0oOOCkuagueOBq+aMgeOBo+OBpuOBjeOBpgovLyDlrZDjga7jgYbjgaHjga7lpKfjgY3jgYTmlrnjgajmr5TovIMKLy8g5a2Q44Gu5pa544GM5aSn44GN44GL44Gj44Gf44KJ5Lqk5o+bCi8vIOOCkkhlYXDjgYzlrozmiJDjgZnjgovjgb7jgafnubDjgorov5TjgZkKLy8g5LqL5YmN5a2m57+S6LOH5paZ44GuUC41Nu+9njYwCglpZihzeiA9PSAwKXsKICAgICAgICBwcmludGYoIkVycm9yIDogaGVhcCBpcyBlbXB0eVxuIik7CiAgICAgICAgcmV0dXJuIC0xOwogICAgfQogCiAgICBpbnQgcmV0ID0gdFsxXTsKICAgIHRbMV0gPSB0W3N6XTsKICAgIHRbc3pdID0gLTE7CiAgICBzei0tOwogCiAgICBpbnQgaSA9IDE7CiAgICB3aGlsZSgxKXsKICAgICAgICBpbnQgbCA9IGdvTChpKTsKICAgICAgICBpbnQgciA9IGdvUihpKTsKICAgICAgICBpbnQgbGFyZ2VzdCA9IGk7CiAKICAgICAgICBpZihsICE9IDAgJiYgdFtsXSA+IHRbbGFyZ2VzdF0pewogICAgICAgICAgICBsYXJnZXN0ID0gbDsKICAgICAgICB9CiAgICAgICAgaWYociAhPSAwICYmIHRbcl0gPiB0W2xhcmdlc3RdKXsKICAgICAgICAgICAgbGFyZ2VzdCA9IHI7CiAgICAgICAgfQogCiAgICAgICAgaWYobGFyZ2VzdCA9PSBpKSBicmVhazsKIAogICAgICAgIHN3YXAoJnRbaV0sICZ0W2xhcmdlc3RdKTsKICAgICAgICBpID0gbGFyZ2VzdDsKICAgIH0KIAogICAgcmV0dXJuIHJldDsKfQogCi8v5pyr5bC+44Gr6KaB57Sg44KS6L+95Yqg44GZ44KLCi8v44Ki44OD44OX44OS44O844OXCnZvaWQgcHVzaEhlYXAoaW50IHgpewovLyDmnKvlsL7jgavov73liqAKLy8g6Kaq44Go5q+U6LyD44GX44Gm44CB5a2Q44Gu5pa544GM5aSn44GN44GL44Gj44Gf44KJ5Lqk5o+bCi8vIOOCkkhlYXDjgYzlrozmiJDjgZnjgovjgb7jgafnubDjgorov5TjgZkKICAgIGlmKHN6ICsgMSA+PSBNQVgpewogICAgICAgIHByaW50ZigiRXJyb3IgOiBoZWFwIG92ZXJmbG93XG4iKTsKICAgICAgICByZXR1cm47CiAgICB9CiAKICAgIHN6Kys7CiAgICB0W3N6XSA9IHg7CiAKICAgIGludCBpID0gc3o7CiAgICB3aGlsZShnb1AoaSkgIT0gMCAmJiB0W2ldID4gdFtnb1AoaSldKXsKICAgICAgICBzd2FwKCZ0W2ldLCAmdFtnb1AoaSldKTsKICAgICAgICBpID0gZ29QKGkpOwogICAgfQp9CiAKaW50IG1haW4odm9pZCl7CiAgICBpbnQgaSx4LG47CiAgICBzY2FuZigiJWQiLCZuKTsKICAgIC8vIOacqOOBruWIneacn+WMlgogICAgaW5pdFRyZWUobik7CiAgICBmb3IoaT0wO2k8bjtpKyspewogICAgICAgIHNjYW5mKCIlZCIsJnRbaSsxXSk7CiAgICB9CiAgICBzeiA9IG47CiAgICAvLyDkuK3plpPpoIbjgafooajnpLoKCWluT3JkZXIoMSk7CiAKCS8vIHBvcAoJaW50IGE9cG9wSGVhcCgpOwoJcHJpbnRmKCJwb3AgOiAlZFxuIixhKTsKCWluT3JkZXIoMSk7CiAKCWEgPSBwb3BIZWFwKCk7CglwcmludGYoInBvcCA6ICVkXG4iLGEpOwogCglpbk9yZGVyKDEpOwogCglwcmludGYoInB1c2ggOiAxMDBcbiIpOwoJcHVzaEhlYXAoMTAwKTsKCWluT3JkZXIoMSk7CiAKCXByaW50ZigicHVzaCA6IDMwXG4iKTsKCXB1c2hIZWFwKDMwKTsKCWluT3JkZXIoMSk7CiAgICByZXR1cm4gMDsKfQ==