Pagini recente » Cod sursa (job #1541336) | Cod sursa (job #1820945) | Cod sursa (job #1662758) | Cod sursa (job #1879302) | Cod sursa (job #2273363)
#include <fstream>
#include<vector>
using namespace std;
vector<int> v;
struct secv {
int sum,start,finish;
secv(int a,int b,int c) : sum(a),start(b),finish(c){}
};
int n;
ifstream f("ssm.in");
ofstream g("ssm.out");
secv divide(int left,int right)
{
if(left==right) {return {v[left],left,left};}
else {
int mid=left+(right-left)/2;
secv ans1=divide(left,mid);
secv ans3=divide(mid+1,right);
int Max=v[mid],s=v[mid],indice=mid;
for(int i=mid-1;i>=left;--i)
if((s+=v[i])>=Max) {
Max=s;
indice=i;
}
int Max2=v[mid+1],s2=v[mid+1],indice2=mid+1;
for(int i=mid+2;i<=right;++i)
if((s2+=v[i])>=Max2) {
Max2=s2;
indice2=i;
}
secv ans2(Max+Max2,indice,indice2);
if(ans1.sum>ans2.sum)
{
if(ans3.sum>ans1.sum) return ans3;
return ans1;
}
if(ans2.sum>ans1.sum)
{
if(ans3.sum>ans2.sum) return ans3;
return ans2;
}
if(ans3.sum>ans2.sum) return ans3;
if(ans1.start<ans2.start) return ans1;
if(ans2.start<ans1.start) return ans2;
return ans2;
}
}
int main()
{
f>>n;
v.resize(n);
for(int i=0;i<n;++i) f>>v[i];
secv ans=divide(0,n-1);
g<<ans.sum<<' '<<ans.start+1<<' '<<ans.finish+1<<'\n';
return 0;
}