#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
class Task {
public:
void solve() {
read_input();
get_result();
}
private:
int size;
vector<int> v;
void read_input() {
ifstream fin("ssm.in");
fin >> size;
for (int i = 0, elem; i < size; i++) {
fin >> elem;
v.push_back(elem);
}
fin.close();
}
void get_result() {
vector<int> dp(size + 1); // memoizare, unde retin solutia subproblemei
vector<int> start(size + 1);
vector<int> end(size + 1);
// caz de bază, singura subsecventa posibila cu un element
dp[1] = v[1];
start[1] = 1;
end[1] = 1;
// caz general
for (int i = 2; i <= size; ++i) {
if (dp[i - 1] >= 0) { // dp[i − 1] + v[i] >= v[i] are rost sa extind
dp[i] = dp[i - 1] + v[i];
start[i] = start[i - 1];
end[i] = i;
} else { // dp[i − 1] + v[i] < v[i] renunt la subsecventa de pana acum
dp[i] = v[i];
start[i] = i;
end[i] = i;
}
}
// soluția e maximul din vectorul dp
int sol = dp[1];
int strt = start[1];
int nd = end[1];
for (int i = 2; i <= size; ++i) {
if (dp[i] > sol) {
sol = dp[i];
strt = start[i];
nd = end[i];
}
}
ofstream fout("ssm.out");
fout << sol << " " << strt + 1 << " " << nd + 1 << endl;
fout.close();
}
};
int main() {
auto* task = new (nothrow) Task();
if (!task) {
cerr << "new failed\n";
return -1;
}
task->solve();
delete task;
return 0;
}