解法一:小根堆
堆的实现参见堆。通过不断找父节点打印路径。
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
String[] input;
input = reader.readLine().split(" ");
final int N = Integer.parseInt(input[0]);
final int M = Integer.parseInt(input[1]);
input = reader.readLine().split(" ");
Heap heap = new Heap();
for (int i = 0; i < N; ++i) {
heap.offer(Integer.parseInt(input[i]));
}
input = reader.readLine().split(" ");
for (int i = 0; i < M; ++i) {
int start = Integer.parseInt(input[i]);
heap.printPath(start - 1);
}
}
}
class Heap {
// 实际大小
private int size;
// 最大容量
private int capacity;
// 数据
int[] data;
/**
* 初始化
*/
public Heap() {
size = 0;
capacity = 1000;
data = new int[capacity];
}
/**
* 向上堆化
*
* @param i 起始位置
*/
private void fixUp(int i) {
int num = data[i];
int father = (i - 1) / 2;
while ((i > 0) && (data[father] > num)) {
data[i] = data[father];
i = father;
father = (i - 1) / 2;
}
data[i] = num;
}
/**
* 添加元素
*
* @param item 元素值
*/
public void offer(int item) {
// 扩容
if (size == capacity) {
data = Arrays.copyOf(data, data.length * 2);
capacity *= 2;
}
data[size++] = item;
fixUp(size - 1);
}
public void printPath(int start) {
List<Integer> path = new ArrayList<>((int) (Math.log(size) / Math.log(2)));
path.add(data[start]);
while (start > 0) {
start = (start - 1) / 2;
path.add(data[start]);
}
for (int i = 0; i < path.size() - 1; ++i) {
System.out.print(path.get(i) + " ");
}
System.out.println(path.get(path.size() - 1));
}
}