//法1:通过插入建立最小堆
#include <iostream>
#define MAXN 1010
#define MINDATA -10001
using namespace std;
int H_size=0;
int H_capacity=MAXN;
int* H;
bool IsFull(){
return (H_size==H_capacity);
}
void InsertH(int x){
if(IsFull()) return;
H_size++;
int i;
for(i=H_size;H[i/2]>x;i=i/2){
H[i]=H[i/2];
}
//保证退出来最小下标为1
H[i]=x;
}
void CreateH(){
//建立哨兵
H[0]=MINDATA;
int tmp;
for(int i=1;i<=H_capacity;i++){
cin>>tmp;
InsertH(tmp);
}
}
void PrintL(int index){
int flag=0;
for(int i=index;i>0;i=i/2){
if(flag) printf(" %d",H[i]);
else{
printf("%d",H[i]);
flag=1;
}
}
}
int main(){
int M;
cin>>H_capacity>>M;
H=new int[H_capacity+1];
CreateH();
int tmp;
for(int i=0;i<M;i++){
cin>>tmp;
PrintL(tmp);
cout<<endl;
}
return 0;
}
//由题必须插入因此递归建立的答案会错,但是其实也是最小堆,只是可能是同构的
//法2:通过递归建立最小堆
#include <iostream>
#define MAXN 1010
#define MINDATA -10001
using namespace std;
int H_size=0;
int H_capacity=MAXN;
int* H;
void percDown(int index){
int x=H[index];
int parent,child;
for(parent=index;parent*2<=H_size;parent=child){
child=parent*2;
if(child!=H_size && H[child+1]<H[child]){
child++;
}
if(H[child]<x) H[parent]=H[child];
else break;
}
H[parent]=x;
}
void CreateH(){
//建立哨兵
H[0]=MINDATA;
for(int i=1;i<=H_capacity;i++){
cin>>H[i];
H_size++;
}
for(int i=H_size/2;i>0;i--){
percDown(i);
}
}
void PrintL(int index){
int flag=0;
for(int i=index;i>0;i=i/2){
if(flag) printf(" %d",H[i]);
else{
printf("%d",H[i]);
flag=1;
}
}
}
int main(){
int M;
cin>>H_capacity>>M;
H=new int[H_capacity+1];
CreateH();
int tmp;
for(int i=0;i<M;i++){
cin>>tmp;
PrintL(tmp);
cout<<endl;
}
return 0;
}
#include <iostream>
#define MAXN 1010
#define MINDATA -10001
using namespace std;
struct HeapStruct
{
int *Elements;
int Size;
int Capicity;
};
typedef HeapStruct* MinHeap;
MinHeap Create(int capicity){
MinHeap H=new HeapStruct;
H->Elements=new int[capicity+1];
H->Elements[0]=MINDATA;
H->Size=0;
H->Capicity=capicity;
return H;
}
bool IsFull(MinHeap H){
return (H->Size==H->Capicity);
}
void Insert(MinHeap H,int x){
//插入先判满
if(IsFull(H)) return;
H->Size++;
int i;
for(i=H->Size;H->Elements[i/2]>x;i=i/2){
//上滤,插入只会影响一条路径
H->Elements[i]=H->Elements[i/2];
}
H->Elements[i]=x;
}
void PrintL(MinHeap H,int root){
int flag=0;
for(int i=root;i>0;i=i/2){
//打印出至根节点的路径
if(flag) cout<<" "<<H->Elements[i];
else{
cout<<H->Elements[i];
flag=1;
}
}
cout<<endl;
}
int main(){
int N,M;
cin>>N>>M;
MinHeap H=Create(N);
int tmp;
for(int i=1;i<=N;i++){
cin>>tmp;
Insert(H,tmp);
}
for(int i=0;i<M;i++){
cin>>tmp;
PrintL(H,tmp);
}
return 0;
}