Pagini recente » Borderou de evaluare (job #201423) | Cod sursa (job #3202705) | Cod sursa (job #3182420) | Cod sursa (job #1081905) | Cod sursa (job #1988297)
#include <vector>
#include <iostream>
#include <queue>
#include <set>
#include <cassert>
#include <limits>
#include <algorithm>
#include <map>
using namespace std;
int main() {
freopen("euro.in", "r", stdin);
freopen("euro.out", "w", stdout);
int n, t;
cin >> n >> t;
vector<long long> gain(n + 1);
for (int i = 1; i <= n; ++i) {
cin >> gain[i];
gain[i] += gain[i - 1];
}
map<int, long long> funs;
long long ans = 0;
for (int i = 1; i <= n; ++i) {
long long best = 0;
for (auto p : funs) {
best = max(best, p.first * i + p.second);
}
ans = gain[i] * i - t + best;
if (funs.count(-gain[i]))
funs[-gain[i]] = min(funs[-gain[i]], ans);
else funs[-gain[i]] = ans;
}
cout << ans << endl;
return 0;
}