function maxSubarraySumCircular(nums: number[]): number {
    let [globalMax, globalMin] = [nums[0], nums[0]];
    let [currentMax, currentMin] = [0, 0];
    let total = 0;

    for (let num of nums) {
        currentMax = Math.max(num, currentMax + num);
        currentMin = Math.min(num, currentMin + num);
        total += num;
        globalMax = Math.max(globalMax, currentMax);
        globalMin = Math.min(globalMin, currentMin);
    }

    return globalMax > 0 ? Math.max(globalMax, total - globalMin) : globalMax;
}