Cod sursa(job #820708)

Utilizator wink.itsgoneDragusanu Ana wink.itsgone Data 21 noiembrie 2012 09:37:18
Problema Subsecventa de suma maxima Scor 65
Compilator cpp Status done
Runda Arhiva educationala Marime 1.07 kb
#include<fstream>
#define Nmax 6000005
using namespace std;
ifstream f("ssm.in"); ofstream g("ssm.out");
int inf;
int N,st,dr,Smax,a[Nmax];
inline void gsm(int,int,int &,int &,int &);
int main()
{	inf=-1000000000; //inf=-inf*inf;
	f>>N;
	for (register int i = 1; i <= N; i++) f>>a[i];
	gsm(1,N,Smax,st,dr);
	g<<Smax<<' '<<st<<' '<<dr<<'\n';
	return 0;
}
inline void gsm(int s, int d, int &sum, int &pi,int &pf) {
    if (s == d) {sum=a[s]; pi=pf=s; return ;}
    int mid = (s + d) / 2; 
	int sum1=0,sum2=0,pi1,pf1,pi2,pf2,pi3,pf3;
    gsm(s, mid,sum1,pi1,pf1);
    gsm(mid + 1, d,sum2,pi2,pf2);
    long long suf = 0,pre = 0; 
    long long maxSuf =inf,maxPre =inf;
    for (register int i = mid; i >= s; i--) {
        suf += a[i];
        if (maxSuf < suf) 
			{maxSuf = suf;
			 pi3=i;
			}
    }
    for (register int i = mid + 1; i <= d; i++) {
        pre += a[i];
        if (maxPre < pre) 
			{maxPre = pre;
			 pf3=i;
			}    
    }
	int sum3=maxPre+maxSuf;
	if(sum1>sum2) sum=sum1,pi=pi1,pf=pf1;
		else sum=sum2,pi=pi2,pf=pf2;
	if(sum3>sum) sum=sum3,pi=pi3,pf=pf3;
}