#include <bits/stdc++.h>
using namespace std;

//calculate the maximum subarray sum ending at each index from the left
vector<int> calculatePrefixMaxSum(const vector<int>& nums) {
    int n = nums.size();
    vector<int> prefixMaxSum(n, 0);
    int currentMax = nums[0];
    prefixMaxSum[0] = nums[0];
    
    for (int i = 1; i < n; ++i) {
        currentMax = max({0, nums[i], currentMax + nums[i]});
        prefixMaxSum[i] = currentMax;
    }
    
    return prefixMaxSum;
}

//calculate the maximum subarray sum starting at each index from the right
vector<int> calculateSuffixMaxSum(const vector<int>& nums) {
    int n = nums.size();
    vector<int> suffixMaxSum(n, 0);
    int currentMax = nums[n-1];
    suffixMaxSum[n-1] = nums[n-1];
    
    for (int i = n - 1; i >= 0; i--) {
    	currentMax = max({0, nums[i], currentMax + nums[i]});
        suffixMaxSum[i] = currentMax;
    }
    
    return suffixMaxSum;
}

int maxTwoNonOverlappingSubarraysSum(const vector<int>& nums) {
    int n = nums.size();
    if (n == 0) return 0;

    // Calculate prefix and suffix max subarray sums
    vector<int> prefixMaxSum = calculatePrefixMaxSum(nums);
    vector<int> suffixMaxSum = calculateSuffixMaxSum(nums);

    vector<int> maxPrefixSum(n+1, 0);
    maxPrefixSum[0] = prefixMaxSum[0];
    for (int i = 1; i < n; ++i) {
        maxPrefixSum[i] = max(maxPrefixSum[i - 1], prefixMaxSum[i]);
    }

    vector<int> maxSuffixSum(n+1, 0);
    maxSuffixSum[n-1] = suffixMaxSum[n-1];
    for (int i = n - 1; i >= 0; i--) {
        maxSuffixSum[i] = max(maxSuffixSum[i + 1], suffixMaxSum[i]);
    }

    int maxSum = 0;
    for (int i = 0; i < n ; ++i) {
    	// cout<<maxSum<<"i is "<<i<<endl;
        maxSum = max(maxSum, maxPrefixSum[i] + maxSuffixSum[i + 1]);
    }

    return maxSum;
}

int main() {
	int n;cin>>n;
    vector<int> nums(n);
    for(int i=0;i<n;i++){
    	cin>>nums[i];
    }
    cout << "Maximum sum of two non-overlapping subarrays: " << maxTwoNonOverlappingSubarraysSum(nums) << endl;
    return 0;
}
