注意:
题目说的是插入小顶堆
所以每次插入之后都一定是小顶堆,而不是都插入完成之后再去堆化为小顶堆。
每次插入一个元素以后,都要和它的父节点判断,如果当前的节点比父节点值更小,就跟父节点交换,同时对父节点进行递归处理,直到到达地根节点。
输出也很简单,只需要每次不断的指向父节点即可。
#include <iostream>
#include <vector>
#include <string>
#include <cmath>
#include <algorithm>
#include <queue>
#include <cstdio>
#include <cctype>
#include <unordered_map>
#include <map>
#include <cstring>
using namespace std;
const int N = 1005;
int arr[N];
void heapify(int arr[], int u){
if(u==1) return;
if(arr[u/2] > arr[u]) swap(arr[u/2], arr[u]);
heapify(arr, u/2);
}
int main(){
int n, m, v;
cin>>n>>m;
for(int i = 1; i <= n; i++){
cin>>arr[i];
heapify(arr, i);
}
while(m--){
cin>>v;
for(int i = v; i >= 1; i /= 2){
if(i == 1) cout<<arr[i]<<endl;
else cout<<arr[i]<<" ";
}
}
return 0;
}