import java.util.*; public class MergeableHeap { static Random random = new Random(); public static class Heap { int value; Heap left; Heap right; Heap(int value) { this.value = value; } } public static Heap merge(Heap a, Heap b) { if (a == null) return b; if (b == null) return a; if (a.value > b.value) { Heap t = a; a = b; b = t; } if (random.nextBoolean()) { Heap t = a.left; a.left = a.right; a.right = t; } a.left = merge(a.left, b); return a; } public static Heap add(Heap h, int value) { return merge(h, new Heap(value)); } public static class HeapAndResult { Heap heap; int value; HeapAndResult(Heap h, int value) { this.heap = h; this.value = value; } } public static HeapAndResult removeMin(Heap h) { return new HeapAndResult(merge(h.left, h.right), h.value); } // Usage example public static void main(String[] args) { Heap h = null; h = add(h, 3); h = add(h, 1); h = add(h, 2); while (h != null) { HeapAndResult hv = removeMin(h); System.out.println(hv.value); h = hv.heap; } } }