Pagini recente » Cod sursa (job #859486) | Cod sursa (job #2344606) | Cod sursa (job #1888160) | Cod sursa (job #1727628) | Cod sursa (job #1370725)
#include <iostream>
#include <fstream>
#include <cstdio>
using namespace std;
int a[1000000];
pair<int,pair<int,int>> cross(int low,int mid,int high){
int left_sum = -(1<<30);
int right_sum = -(1<<30);
int sum =0;
int max_left;
int max_right;
for(int i = mid; i>=low; i--){
sum += a[i];
if(sum >= left_sum){
max_left = i;
left_sum = sum;
}
}
sum =0;
for(int i = mid+1; i< high; i++){
sum += a[i];
if(sum >= right_sum){
max_right = i;
right_sum = sum;
}
}
return pair<int,pair<int,int>>(left_sum+right_sum,pair<int,int>(max_left,max_right));
}
pair<int,pair<int,int>> solve(int low,int high){
if(low+1 == high){
return pair<int,pair<int,int>>(a[low],pair<int,int>(low,low));
}
int mid = (low+high)/2;
pair<int,pair<int,int>> lower = solve(low,mid);
pair<int,pair<int,int>> higher = solve(mid,high);
pair<int,pair<int,int>> cross_over = cross(low,mid,high);
if(lower.first >= higher.first && lower.first >= cross_over.first)
return lower;
if(higher.first >= lower.first && higher.first >= cross_over.first)
return higher;
return cross_over;
}
int main(){
ifstream in("ssm.in");
ofstream out("ssm.out");
int n;
in >> n;
for(int i = 0; i < n; i++){
in >> a[i];
}
pair<int,pair<int,int>> a = solve(0,n);
out << a.first << " " << a.second.first+1 << " " << a.second.second+1 << endl;
}