题目:堆中的路径
思路:向上调整建堆,然后输出对应路径即可。。
代码:
#include <cstdio>
#include <cstring>
#include <algorithm>
const int maxn = 1005;
int h[maxn];
void swap(int &a,int &b){
int temp = a;
a = b;
b = temp;
}
void siftUp(int i){//向上调整建堆
if(i == 1) return;
while(i > 1){
if(h[i] < h[i/2]) swap(h[i],h[i/2]);
else break;
i /= 2;
}
}
void prtPath(int cur){
while(cur > 1){
printf("%d ",h[cur]);
cur /= 2;
}
printf("%d\n",h[1]);
}
int main(){
int n,m;
while(scanf("%d%d",&n,&m)!=EOF){
for(int i=1;i<=n;i++){
scanf("%d",&h[i]);
siftUp(i);
}
int start;
for(int i=0;i<m;i++){
scanf("%d",&start);
prtPath(start);
}
}
return 0;
}