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
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
#include "maklib.h"
#include "message.h"

#include <iostream>
using namespace std;

int main(){
	int liczbaElementow =  Size();
	int ileInstancji = NumberOfNodes();
	int poIle = Size()/ ileInstancji;
	if(poIle==0)poIle=1;
	int mojeID = MyNodeId();
	
		long long max = 0;
		long long dotychczas = 0;
		long long start = 0;
		long long left = 0;
		long long maxLeft;
		long long right = 0;
		long long maxRight = 0;
		long long all = 0;
		long long el;
	if(mojeID+1 != ileInstancji){
		for(int i= mojeID*poIle; i< (mojeID+1)*poIle; i++){
			el =ElementAt(i+1) ;
			if(el+ dotychczas > max)
				max = el + dotychczas;
			if(dotychczas + el >= 0)
				dotychczas+= el;
			if(dotychczas + el < 0)
				dotychczas = 0;
			left+=el;
			if(left>maxLeft)maxLeft = left;
			all+=el;
		}
		for(int i= (mojeID+1)*poIle-1; i>=mojeID*poIle; i--){
			right+=ElementAt(i+1);
			if(right>maxRight)maxRight = right;
		}
	}else{
		for(int i= mojeID*poIle; i< liczbaElementow; i++){
			el =ElementAt(i+1) ;
			if(el+ dotychczas > max)
				max = el + dotychczas;
			if(dotychczas + el >= 0)
				dotychczas+= el;
			if(dotychczas + el < 0)
				dotychczas = 0;
			left+=el;
			if(left>maxLeft)maxLeft = left;
			all+=el;
		
		}
		for(int i= liczbaElementow-1; i>= mojeID*poIle; i--){
			right+=ElementAt(i+1);
			if(right>maxRight)maxRight = right;
		}
	}
	
	if (mojeID+1 != ileInstancji) {
    	PutLL(ileInstancji-1, max);
    	PutLL(ileInstancji-1, maxLeft);
    	PutLL(ileInstancji-1, maxRight);
    	PutLL(ileInstancji-1, all);
    	Send(0);
  	} else {
  		Receive(0);
  		long long max0 = GetLL(0);
      	long long left0 = GetLL(0);
      	long long right0 = GetLL(0);
      	long long all0 = GetLL(0);
      	long long MAX = max0;
      	long long max1 ;
      	long long left1;
      	long long right1;
      	long long all1;
    	for (int instancja = 1; instancja < NumberOfNodes()-1; ++instancja) {
      			Receive(instancja);
      			max1 = GetLL(instancja);
      			left1 = GetLL(instancja);
      			right1 = GetLL(instancja);
      			all1 = GetLL(instancja);
      			if(MAX<max1)MAX = max1;
      			if(MAX<right0+left0)MAX=right0+left0;
      			
    	}
    	if(MAX<max)MAX=max;
    	if(MAX<right0+maxLeft)MAX=right0+maxLeft;
    	cout<<MAX<<"\n";
  	}	
	return 0;
}