```ts
export function siftDownRun(heap: number[], start: number): number[][] {
  if (heap.length === 0) {
    throw new Error("Heap is empty");
  }
  if (start < 0 || start >= heap.length) {
    throw new Error("Start index out of bounds");
  }
  if (!Number.isInteger(heap[start])) {
    throw new Error("Heap entry is not a whole number");
  }

  const originalHeap = [...heap];
  let current = start;
  while (true) {
    const left = 2 * current + 1;
    const right = 2 * current + 2;
    let smallest = current;

    if (left < heap.length && heap[left] < heap[smallest]) {
      smallest = left;
    }
    if (right < heap.length && heap[right] < heap[smallest]) {
      smallest = right;
    }

    if (smallest === current) {
      break;
    }

    const temp = heap[current];
    heap[current] = heap[smallest];
    heap[smallest] = temp;
    current = smallest;
  }

  return [heap, originalHeap.map((_, index) => index).slice(start)];
}
```