Pagini recente » Cod sursa (job #33057) | Cod sursa (job #827989) | Cod sursa (job #3159971) | Cod sursa (job #1143762) | Cod sursa (job #2675778)
#include <iostream>
#include <fstream>
#include <climits>
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)
{
if (st == dr)//daca am ajuns la un singur element
{
rst = st;
rdr = dr;
//se returneaza pozitia elementului
}
else
{
int mij = (st+dr)/2; //se calculeaza mijlocul
in ain;
div (st, mij , ain.s, ain.d);
int a = s[ain.d] - s[ain.s - 1]; //declar si calculez coordonatele din stanga + suma
in bin;
div (mij+1, dr, bin.s, bin.d);
int b = s[bin.d] - s[bin.s - 1]; //declar si calculez coordonatele din dreapta + suma
int i;
int sumst = 0;
int maxsumst = INT_MIN;
int maxindst = 0;
for (i = mij; i >= 1; i--)
{
sumst += v[i];
if (sumst >= maxsumst)
{
maxsumst = sumst;
maxindst = i;
}
} //am calculat coordonatele din stanga + sumamax din stanga
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;
}
} // am calculat coordonatele din dreapta + summax din dreapta
//cout << " ain.s=" << ain.s << " ain.d=" << ain.d << " a=" << a << '\n';
//cout << " bin.s=" << bin.s << " bin.d=" << bin.d << " b=" << b << '\n';
//cout << " maxindst=" << maxindst << " maxinddr=" << maxinddr << " maxsumst+maxsumdr=" << maxsumst+maxsumdr << '\n';
int m = max(a, b);
m = max (m, maxsumst+maxsumdr); //calculez suma maxima
//cout << "m=" << m << '\n';
if (m == a) //daca suma maxima ii subsecventa din stanga
{
rst = ain.s;
rdr = ain.d;
if (s[rdr] - s[rst - 1] > s[drm] - s[stm-1])
{
drm = rdr;
stm = rst;
}
}
else if (m == b) //daca suma maxima ii subsecventa din dreapta
{
rst = bin.s;
rdr = bin.d;
if (s[rdr] - s[rst - 1] > s[drm] - s[stm-1])
{
drm = rdr;
stm = rst;
}
}
else
{ //daca suma maxima ii subsecventa din mijloc
rst = maxindst;
rdr = maxinddr;
if (s[rdr] - s[rst - 1] > s[drm] - s[stm-1])
{
drm = rdr;
stm = rst;
}
}
}
}
int main()
{
fin >> n;
for (int i = 1; i <= n ; i++)
{
fin >> v[i];
s[i] = s[i-1] + v[i];
}
int o,p;
div (1, n, o, p);
fout << s[drm] - s[stm-1] << ' ' << stm << ' ' << drm;
return 0;
}