Pagini recente » Cod sursa (job #1950841) | Cod sursa (job #694719) | Cod sursa (job #1389710) | Cod sursa (job #2489514) | Cod sursa (job #3031185)
#include <fstream>
#include <vector>
using namespace std;
struct Sol {
int sum;
int left;
int right;
void Update(int new_sum, int new_left, int new_right) {
int len = right - left + 1;
int new_len = new_right - new_left + 1;
auto change = new_sum > sum ||
(new_sum == sum && (new_left < left ||
(new_left == left && new_len < len)));
if (change) {
sum = new_sum;
left = new_left;
right = new_right;
}
}
};
Sol Solve(const vector<int>& vec) {
Sol sol;
sol.sum = vec[0];
sol.left = sol.right = 0;
int l = 0;
int sum = 0;
for (size_t i = 0; i < vec.size(); i += 1) {
sum = max(vec[i], sum + vec[i]);
sol.Update(sum, l, i);
if (sum < 0) {
l = i + 1;
sum = 0;
}
}
return sol;
}
int main() {
ifstream fin("ssm.in");
ofstream fout("ssm.out");
int n;
fin >> n;
vector<int> vec(n);
for (auto& num : vec) {
fin >> num;
}
auto res = Solve(vec);
fout << res.sum << " " << res.left + 1 << " " << res.right + 1 << "\n";
return 0;
}