Pagini recente » Cod sursa (job #2300922) | Cod sursa (job #358397) | Cod sursa (job #1414937) | Ciorna | Cod sursa (job #2675749)
#include <iostream>
#include <fstream>
#include <algorithm>
using namespace std;
ifstream fin ("ssm.in");
ofstream fout ("ssm.out");
const int valMax = 6e6;
struct in
{
int s, d;
};
int v[valMax+1], s[valMax+1], stm, drm, sm = 0, n;
void div (int st, int dr, int &rst, int &rdr)
{
//cout << "st=" << st << ' ' << "dr=" << dr << '\n';
if (st == dr)
{
rst = st;
rdr = dr;
//cout << "rst=" << rst << '\n';
//cout << "rdr=" << rdr << '\n';
return;
}
int mij = (st+dr)/2;
//cout << "mij=" << mij << '\n';
in ain;
div (st, mij , ain.s, ain.d);
int a = s[ain.d] - s[ain.s - 1];
in bin;
div (mij+1, dr, bin.s, bin.d);
int b = s[bin.d] - s[bin.s - 1];
int sumst = 0;
int maxsumst = INT_MIN, i;
int maxindst = 0;
for (i = mij; i >= 1; i--)
{
sumst += v[i];
if (sumst > maxsumst)
{
maxsumst = sumst;
maxindst = i;
}
}
int sumdr = 0;
int maxsumdr = INT_MIN;
int maxinddr = 0;
for (i = mij + 1; i <= n; i++)
{
sumdr =+ v[i];
if (sumdr > maxsumdr)
{
maxsumdr = sumdr;
maxinddr = i;
}
}
int m = max(a, b);
m = max (m, maxsumst+maxsumdr);
if (m == a)
{
rst = ain.s;
rdr = ain.d;
return;
}
if (m == b)
{
rst = bin.s;
rdr = bin.d;
return;
}
rst = maxindst;
rdr = maxinddr;
return;
}
int main()
{
fin >> n;
for (int i = 1; i <= n ; i++)
{
fin >> v[i];
s[i] = s[i-1] + v[i];
}
div (1, n, stm, drm);
fout << s[drm] - s[stm-1] << ' ' << stm << ' ' << drm;
return 0;
}