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
93
94
95
96
#include <iostream>
#include "message.h"
#include "kanapka.h"

using namespace std;

int main(){
	auto tot_elem = GetN();
	auto tot_nodes = NumberOfNodes();
	auto this_node = MyNodeId();

	auto elem_per_node = tot_elem/tot_nodes + 1;
	long long begin = this_node * elem_per_node;
	long long end = begin + elem_per_node;
	if(end > tot_elem)
		end = tot_elem;

	//cout<<begin<<" "<<end<<endl;

	const int master_node_id = 0;

	if(begin >= tot_elem){
		if(this_node != master_node_id){
			char is_node_active = 0;
			PutChar(master_node_id, is_node_active);
			PutLL(master_node_id, 0);
			Send(master_node_id);
		}

		return 0;
	}
	
	//long long diag = 0;
	long long left_sum = 0, right_sum = 0;
	for(long long i = 0; i <= begin; ++i){
		left_sum += GetTaste(i);
		//++diag;
	}

	long long max_sum = left_sum;

	while(true){
		right_sum = 0;
		for(long long i = tot_elem - 1; i >= end; --i){
			//++diag;
			right_sum += GetTaste(i);

			if(right_sum>max_sum)
				max_sum = right_sum;

			if(left_sum + right_sum>max_sum)
				max_sum = left_sum + right_sum;
		}

		if(left_sum>max_sum)
			max_sum = left_sum;

		++begin;

		if(begin>=end)
			break;
		
		left_sum += GetTaste(begin);
	}

	//cout<<"diag: "<<diag<<endl;

	if(this_node == master_node_id){
		for(int i = 0; i<tot_nodes-1; ++i){
			int sender = Receive(-1);
			//cout<<"receiving from "<<sender<<endl;
			bool is_node_active = GetChar(sender);
			long long node_max_sum = GetLL(sender);
			if(!is_node_active){
				//cout<<"node "<<sender<<" inactive"<<endl;
				continue;
			}

			//cout<<"node_max_sum sum: "<<node_max_sum<<endl;

			if(node_max_sum > max_sum)
				max_sum = node_max_sum;
			
		}

		//cout<<"MAX SUM: "<<max_sum<<endl;
		cout<<max_sum<<endl;
	}
	else{
		//cout<<"sending to master "<<endl;
		char is_node_active = 1;
		PutChar(master_node_id, is_node_active);
		PutLL(master_node_id, max_sum);
		Send(master_node_id);
	}
}