将一系列给定数字插入一个初始为空的小顶堆H[]。随后对任意给定的下标i,打印从H[i]到根结点的路径。
输入格式:
每组测试第1行包含2个正整数N和M(≤),分别是插入元素的个数、以及需要打印的路径条数。下一行给出区间[-10000, 10000]内的N个要被插入一个初始为空的小顶堆的整数。最后一行给出M个下标。
输出格式:
对输入中给出的每个下标i,在一行中输出从H[i]到根结点的路径上的数据。数字间以1个空格分隔,行末不得有多余空格。
输入样例:
5 3
46 23 26 24 10
5 4 3
输出样例:
24 23 10 46 23 10 26 10
/*
Name:
Copyright:
Author: 流照君
Date: data
Description:
*/
#include <iostream>
#include<string>
#include <algorithm>
#include <vector>
#define inf 100005
using namespace std;
typedef long long ll;
typedef int element_type;
typedef struct node *heap;
struct node{
element_type *data;
int size;
int capacity;
};
heap creat_heap(int n)
{
heap min_heap=(heap)malloc(sizeof(heap));
min_heap->data=(element_type*)malloc((n+1)*sizeof(element_type));
min_heap->size=0;
min_heap->capacity=n+1;
min_heap->data[0]=-inf;
return min_heap;
}
void insert(heap min_heap,int v)
{
if(min_heap->size==min_heap->capacity-1)
return ;
min_heap->data[++min_heap->size]=v;
int i=min_heap->size;
for(;min_heap->data[i/2]>v;i=i/2)
min_heap->data[i]=min_heap->data[i/2];
min_heap->data[i]=v;
}
int main(int argc, char** argv)
{
#ifdef ONLINE_JUDGE//条件编译,如果有oj则忽略文件读取
#else
//freopen("in.txt", "r", stdin);//输入输出文件重定向
//freopen("out.txt", "w", stdout);
#endif //#if, #ifdef, #ifndef这些条件命令的结束标志.
//代码位置
int n,t,temp,cnt;
heap heap1;
cin>>n>>t;
heap1=creat_heap(n);
for(int i=1;i<=n;i++)
{
cin>>temp;
insert(heap1,temp);
}
while(t--)
{
cin>>cnt;
for(int i=cnt;i>1;i=i/2)
{
cout<<heap1->data[i]<<" ";
}
cout<<heap1->data[1]<<endl;
}
return 0;
}