/*
 * 演算法 / Algorithm:
 * 1) 先各自找出最早結束的設施 (start+duration 最小者)。
 *    Find the earliest-finishing ride in each category.
 * 2) 第一個設施固定用最早結束的那個（貪心 / greedy），
 *    再掃另一類，第二個設施開始於 max(firstFinish, otherStart)。
 * 3) 兩種順序各算一次，取最小。Try both orders, take the min.
 */

// 小工具：回傳兩數中較大者 / helper: returns the larger of two ints
static int maxInt(int a, int b) {
    return a > b ? a : b;   // 三元運算子：a>b 成立回 a，否則回 b / ternary operator
}

int earliestFinishTime(int* landStartTime, int landStartTimeSize,
                       int* landDuration, int landDurationSize,
                       int* waterStartTime, int waterStartTimeSize,
                       int* waterDuration, int waterDurationSize) {
    // 先把陸上「最早結束時間」算出來 / earliest finish among land rides
    int minLandFinish = landStartTime[0] + landDuration[0];        // 用第 0 個當初始值 / seed with ride 0
    for (int i = 1; i < landStartTimeSize; i++) {                   // 從第 1 個開始掃 / scan the rest
        int finish = landStartTime[i] + landDuration[i];           // 此設施最早結束 / this ride's finish
        if (finish < minLandFinish) minLandFinish = finish;        // 更新最小值 / keep the smallest
    }

    // 同理算出水上「最早結束時間」/ likewise the earliest water finish
    int minWaterFinish = waterStartTime[0] + waterDuration[0];     // 初始值 / seed
    for (int j = 1; j < waterStartTimeSize; j++) {
        int finish = waterStartTime[j] + waterDuration[j];
        if (finish < minWaterFinish) minWaterFinish = finish;
    }

    // 順序一：先陸後水 / order 1: land then water
    // 第一個固定 minLandFinish，第二個（水上）開始於 max(minLandFinish, 水上開放時間)
    // first ride fixed at minLandFinish; water starts at max(minLandFinish, its open time)
    int best = -1;                                                  // -1 代表還沒填值 / "not set yet"
    for (int j = 0; j < waterStartTimeSize; j++) {
        // 等待邏輯：誰晚就從誰開始 / wait until both "done first ride" and "open"
        int finish = maxInt(minLandFinish, waterStartTime[j]) + waterDuration[j];
        if (best == -1 || finish < best) best = finish;            // 第一次或更小就更新 / update min
    }

    // 順序二：先水後陸 / order 2: water then land
    for (int i = 0; i < landStartTimeSize; i++) {
        int finish = maxInt(minWaterFinish, landStartTime[i]) + landDuration[i];
        if (finish < best) best = finish;                          // 與順序一一起取全域最小 / global min
    }

    return best;   // 兩種順序中最早完成的時間 / earliest finish over both orders
}
