Pagini recente » Cod sursa (job #2890765) | Cod sursa (job #3168090) | Cod sursa (job #2377871) | Cod sursa (job #2679852) | Cod sursa (job #2269838)
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>
using namespace std;
struct Raspuns
{
int sum, left, right;
Raspuns(int s, int l, int r): sum{s}, left{l}, right{r} {};
friend bool operator<(const Raspuns &r1, const Raspuns &r2) { return r1.sum < r2.sum; }
friend ostream& operator<<(ostream &out, const Raspuns &r) { return out << r.sum << ' ' << r.left << ' ' << r.right; }
};
Raspuns divide(vector<int> &v, int left, int right)
{
if(left == right)
return Raspuns(v[left], left, left);
int mid{(left+right)/2};
Raspuns r1{divide(v, left, mid)};
Raspuns r2{divide(v, mid+1, right)};
int sLeft{0}, sRight{0}, s{0}, eLeft, eRight;
for(int i=mid; i>=left; --i)
{
s += v[i];
if(sLeft < s)
{
sLeft = s;
eLeft = i;
}
}
s = 0;
for(int i=mid+1; i<=right; ++i)
{
s += v[i];
if(sRight < s)
{
sRight = s;
eRight = i;
}
}
Raspuns r3{sLeft + sRight, eLeft, eRight};
return max(max(r1, r2), r3);
}
int main()
{
ifstream fin("ssm.in");
int n;
fin >> n;
vector<int> v(n);
for(int i=0; i<n; ++i)
fin >> v[i];
cout << divide(v, 0, n-1);
return 0;
}