```ts
/**
 * Maps a list of integers to their dense ranks based on the specified order.
 * @param values - The array of numbers to rank.
 * @param order - The sorting order, either "asc" or "desc".
 * @returns An array of ranks corresponding to the original positions of the input numbers.
 * @throws Error if the list is empty, contains non-integer elements, or has an invalid order.
 */
export function denseRankMap(values: number[], order: string): number[] {
  if (values.length === 0) {
    throw new Error("The input list cannot be empty.");
  }
  if (!values.every(Number.isInteger)) {
    throw new Error("All elements in the list must be integers.");
  }
  if (order !== "asc" && order !== "desc") {
    throw new Error('Order must be either "asc" or "desc".');
  }

  const sorted = [...values].sort((a, b) => order === "asc" ? a - b : b - a);
  const rankMap = new Map<number, number>();
  let rank = 0;

  for (let i = 0; i < sorted.length; i++) {
    if (!rankMap.has(sorted[i])) {
      rank++;
      rankMap.set(sorted[i], rank);
    }
  }

  return values.map(v => rankMap.get(v)!);
}
```