1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#include<iostream>
#include "maklib.h"
#include "message.h"

#define LL long long int

int main(){
	std::ios_base::sync_with_stdio(false);
	
	LL wynik=0,prefiks=0,sufiks=0,calosc=0;
	unsigned int N=Size();
	unsigned int p=MyNodeId()*(N/NumberOfNodes());
	unsigned int k=(MyNodeId()+1)*(N/NumberOfNodes());
	if(MyNodeId()==NumberOfNodes()-1) k=N;
	LL local_wynik=0;
	for(unsigned int i=p+1;i<=k;++i){
		if((calosc+=(LL)ElementAt(i))>prefiks) prefiks=calosc;
		local_wynik=std::max((LL)0,local_wynik+(LL)ElementAt(i));
		if(local_wynik>wynik)wynik=local_wynik;
	}
	
	local_wynik=0;
	for(unsigned int i=k;i>p;--i)
		if((local_wynik+=(LL)ElementAt(i))>sufiks) sufiks=local_wynik;
	
	
	if(MyNodeId()>0){
		PutLL(0,wynik);
		PutLL(0,prefiks);
		PutLL(0,sufiks);
		PutLL(0,calosc);
		Send(0);
	}
	else{
		prefiks=sufiks;
		for(int i=1;i<NumberOfNodes();++i){
			Receive(i);
			wynik=std::max(wynik,GetLL(i));
			wynik=std::max(wynik,prefiks+GetLL(i));
			LL t_sufiks=GetLL(i);
			prefiks=std::max(t_sufiks,prefiks+GetLL(i));
		}
		
		std::cout<<wynik<<"\n";
	}
	
	return 0;
}