Pagini recente » Cod sursa (job #3343031) | Cod sursa (job #3307467) | Cod sursa (job #3310565) | Diferente pentru utilizator/nod_software intre reviziile 77 si 76 | Cod sursa (job #3340279)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("ssm.in");
ofstream fout("ssm.out");
const int NMAX = 6e6 + 1;
int n, arr[NMAX];
int kadane(int &st, int &dr)
{
st = 1, dr = 1;
int best_sum = INT_MIN, sum_crt = 0, best_st = -1, best_dr = -1;
bool all_negative = true;
for(int i = 1; i <= n; i++)
all_negative &= (arr[i] < 0);
if(all_negative)
{
st = dr = max_element(arr + 1, arr + n + 1) - arr;
return *max_element(arr + 1, arr + n + 1);
}
for(int i = 1; i <= n; i++)
{
if(sum_crt + arr[i] < 0)
{
sum_crt = 0;
st = i + 1, dr = i;
}
else
{
sum_crt += arr[i];
dr++;
}
if(sum_crt > best_sum)
{
best_sum = sum_crt;
best_st = st, best_dr = dr;
}
else if(sum_crt == best_sum)
{
if(st < best_st || dr - st + 1 < best_dr - best_st + 1)
{
best_st = st;
best_dr = dr;
}
}
}
st = best_st, dr = best_dr;
return best_sum;
}
int main()
{
fin >> n;
for(int i = 1; i <= n; i++)
fin >> arr[i];
int st, dr;
fout << kadane(st, dr) << " " << st << " " << dr;
fin.close();
fout.close();
return 0;
}