// 演算法 / Algorithm:
//   最有價值的子陣列就是「整個陣列」,其值 = 全域最大 - 全域最小。
//   The most valuable subarray is the whole array: value = globalMax - globalMin.
//   重複選它 k 次即為答案 / Pick it k times: answer = (max - min) * k.
//   一次掃描找出最大最小,O(n) 時間 / One pass finds max & min in O(n).

long long maxTotalValue(int* nums, int numsSize, int k) {
    // 先把最大、最小都設成第一個元素 / Seed both max and min with the first element.
    // 因為陣列保證非空 (n >= 1),所以 nums[0] 一定存在 / Safe because n >= 1.
    int mx = nums[0];   // mx 記錄目前看過的最大值 / mx = largest seen so far
    int mn = nums[0];   // mn 記錄目前看過的最小值 / mn = smallest seen so far

    // 從第 2 個元素開始逐一比較 / Scan from the second element onward.
    for (int i = 1; i < numsSize; i++) {
        if (nums[i] > mx) mx = nums[i];   // 發現更大就更新 / update if a bigger value appears
        if (nums[i] < mn) mn = nums[i];   // 發現更小就更新 / update if a smaller value appears
    }

    // (mx - mn) 最大可達 10^9,再乘 k (最大 10^5) = 10^14,會超出 int 範圍。
    // (mx - mn) can be up to 10^9; times k (up to 10^5) = 10^14, which overflows 32-bit int.
    // 所以先轉成 long long (64 位元) 再相乘,避免溢位。
    // Cast to long long (64-bit) BEFORE multiplying to avoid overflow.
    return (long long)(mx - mn) * k;
}
