编辑代码

#include <stdio.h>
#include <malloc.h>

#define MAXN 1001
#define MINH -10001

int H[MAXN],size;

void Create();
void Insert(int X);

void Create(){
    size = 0;
    H[0] = MINH;
}

void Insert(int X){
    //省略检查堆满的代码
    int i;
    for(i = ++size;H[i/2] > X;i = i/2){
        H[i] = H[i/2];
    }
    H[i] = X;
}

/*
   将一系列给定数字插入到一个初始为空的小顶堆H[],随后对任意给
   定的下标‘i’,打印从H[i]到根结点的路径
   输入样例:
   5 3  5:结点数,3:要打印的结点个数
   46 23 26 24 10
   5 4 3
*/

int main () {
    int n,m,x,i,j;

    scanf("%d%d",&n,&m);
    //堆初始化
    Create();
    //以逐个插入方式建堆
    for(i = 0;i < n;i++){
        scanf("%d",&x);
        Insert(x);
    }
    for(i = 0;i < m;i++){
        scanf("%d",&j);
        printf("%d ",H[j]);
        //沿根方向输出各结点
        while(j > 1){
            j = j/2;
            printf("%d ",H[j]);
        }
        printf("\n");
    }
    return 0;
}