Cod sursa(job #1370725)

Utilizator xoSauceSergiu Ferentz xoSauce Data 3 martie 2015 16:41:48
Problema Subsecventa de suma maxima Scor 65
Compilator cpp Status done
Runda Arhiva educationala Marime 1.31 kb
#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;
}