import [Link].
ArrayList;
import [Link];
import [Link];
public class CustomHeap {
private List<Integer> heap;
private int childrenCount;
public CustomHeap(int x) {
[Link] = (int) [Link](2, x); // 2^x children per node
[Link] = new ArrayList<>();
public void insert(int value) {
[Link](value);
heapifyUp([Link]() - 1);
public int popMax() {
if ([Link]()) {
throw new IllegalStateException("Heap is empty");
int max = [Link](0);
[Link](0, [Link]([Link]() - 1));
[Link]([Link]() - 1);
heapifyDown(0);
return max;
}
private void heapifyUp(int index) {
while (index > 0) {
int parentIndex = (index - 1) / childrenCount;
if ([Link](index) > [Link](parentIndex)) {
[Link](heap, index, parentIndex);
index = parentIndex;
} else {
break;
private void heapifyDown(int index) {
while (index < [Link]()) {
int largest = index;
for (int i = 1; i <= childrenCount; i++) {
int childIndex = childrenCount * index + i;
if (childIndex < [Link]() && [Link](childIndex) > [Link](largest)) {
largest = childIndex;
if (largest != index) {
[Link](heap, index, largest);
index = largest;
} else {
break;
}
}
public void printHeap() {
[Link](heap);
public static void main(String[] args) {
CustomHeap heap = new CustomHeap(2); // 2^2 = 4 children per node
[Link](10);
[Link](20);
[Link](15);
[Link](30);
[Link](25);
[Link](); // [30, 25, 15, 10, 20]
[Link]("Max: " + [Link]()); // Max: 30
[Link](); // [25, 20, 15, 10]