将一系列给定数字插入一个初始为空的小顶堆 H[]。随后对任意给定的下标 == i ==,打印从 H[i] 到根结点的路径。
输入格式:
每组测试第1行包含2个正整数N和M(≤1000),分别是插入元素的个数、以及需要打印的路径条数。下一行给出区间[-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
Code
#include<bits/stdc++.h>
#define ll long long
#define FAST_IO ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)
using namespace std;
const ll MAXN = 1e12 + 10;
ll n, m, i, j, k, t, w, x, y, z, in, flag, cou, sum, maxn, minn;
string s, s1, s2;
const ll INF = 1e9 + 7;
struct Tree{
ll len,point[1001];
}tree;
void Buildtree(ll x){
ll i;
for(i=++(tree.len);tree.point[i/2]>x;i/=2)
tree.point[i]=tree.point[i/2];
tree.point[i]=x;
}
int main()
{
tree.len=0;tree.point[0]=-10001;
for(cin>>n>>m,i=0;i<n;i++)cin>>j,Buildtree(j);
for(i=0;i<m;i++){
cin>>j;
cout<<tree.point[j];
while(j/2)j/=2,cout<<" "<<tree.point[j];
cout<<endl;
}
return 0;
}