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
#include "kanapka.h"
#include "message.h"

#include <algorithm>
#include <iostream>
using namespace std;

int main() {
	int nodes = NumberOfNodes();
	int id = MyNodeId();

	long long n = GetN();
	long long sz = (n + nodes - 1) / nodes;
	long long p = 0, m = 0, s = 0;
	long long start = id * sz;
	long long finish = min(n, (id + 1) * sz);
	for (long long i = start; i < finish; i++)
	{
		long long value = GetTaste(i);
		s += value;
		if (s > p)
			p = s;
	}

	s = 0;
	for (long long i = finish - 1; i >= start; i--)
	{
		long long value = GetTaste(i);
		s += value;
		if (s > m)
			m = s;
	}

	PutLL(0, p);
	Send(0);
	PutLL(0, s);
	Send(0);
	PutLL(0, m);
	Send(0);

	long long ans = 0;
	long long curr = 0;
	if (id == 0)
	{
		for (int i = 0; i < nodes; i++)
		{
			Receive(i);
			long long pref = GetLL(i);
			Receive(i);
			long long sum = GetLL(i);
			Receive(i);
			long long suff = GetLL(i);

			if (curr + pref > ans)
				ans = curr + pref;
			curr = max(curr + sum, suff);
		}
	}

	cout << ans << endl;

	return 0;
}