class Solution {
public:
struct comp {
bool operator()(const pair<int, int>& p1,
const pair<int, int>& p2) const {
if (p1.first == p2.first) {
return p1.second > p2.second;
}
return p1.first > p2.first;
}
};
long long maximumScore(vector<int>& nums) {
vector<long long> prefixSum;
long long runningSum = 0;
priority_queue<pair<int, int>, vector<pair<int, int>>, comp> PQ;
for (int i = 0; i < nums.size(); i++) {
if (i > 0) {
PQ.push(make_pair(nums[i], i));
}
if (i < nums.size() - 1) {
runningSum += nums[i];
prefixSum.push_back(runningSum);
}
}
long long maximumScore = LONG_LONG_MIN;
for (int i = 0; i < nums.size() - 1; i++) {
while (!PQ.empty() && i >= PQ.top().second)
PQ.pop();
if (!PQ.empty()) {
long long pSum = prefixSum[i] - PQ.top().first;
maximumScore = max(maximumScore, pSum);
}
}
return maximumScore;
}
};