Pagini recente » Cod sursa (job #1809445) | Cod sursa (job #2442645) | Cod sursa (job #1835496) | Cod sursa (job #2675771) | Cod sursa (job #2913234)
#include<bits/stdc++.h>
using namespace std;
const int maxN = 6000005;
int n,sp[maxN],mp[maxN],maxim = INT_MIN;
int main()
{
ifstream fin("ssm.in");
ofstream fout("ssm.out");
fin>>n;
/**
Cea mai mica suma partiala din intervalul [0..0] e sp[0]
**/
mp[0] = 0; //indicele celei mai mici sume partiale
for(int i=1;i<=n;i++)
{
int x;
fin>>x;
sp[i] = sp[i-1] + x;
//Pentru minimele partiale o sa retinem indicii
/**
mp[i] = min(sp[0],sp[1],...,sp[i])
**/
//Daca sp[i] este cea mai mica de pana acum, atunci mp[i] = i, altfel va fi cea de pana acum, adica mp[i-1]
if(sp[i] < sp[mp[i-1]])
mp[i] = i;
else
mp[i] = mp[i-1];
}
int st,dr;
for(int i=1;i<=n;i++) //capatul din dreapta
{
int val = sp[i] - sp[mp[i-1]];
if(val>maxim)
{
maxim = val;
st = mp[i-1]+1;
dr = i;
}
else
if(val==maxim)
{
if(mp[i-1]+1 < st || (mp[i-1]+1==st && i<dr))
{
maxim = val;
st = mp[i-1]+1;
dr = i;
}
}
}
fout<<maxim<<' '<<st<<' '<<dr<<'\n';
return 0;
}