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

using namespace std;

int ni, no, N, b, e, i;
long long a, mp, ms, mc, mm, s;

int main() {
	ni = MyNodeId();
	no = NumberOfNodes();
	N = Size();

	if (N < no) {
		if (ni > 0) {
			return 0;
		}
		b = 0;
		e = N;
	} else {
		b = ni * N / no;
		e = (ni + 1) * N / no;
	}

	for (i = b; i < e; ++i) {
		a = 1LL * ElementAt(i);
		s += a;
		if (s > mp) {
			mp = s;
		}
		if (s < ms) {
			ms = s;
		}
		if (mc < 0) {
			mc = a;
		} else {
			mc += a;
		}
		if (mc > mm) {
			mm = mc;
		}
	
	}
	ms = s - ms;

	if (ni > 0) {
		PutLL(0, mp);
		PutLL(0, mm);
		PutLL(0, s);
		PutLL(0, ms);
		Send(0);
		return 0;
	}

	if (N >= no) {
		mc = ms;
		for (i = 1; i < no; ++i) {
			Receive(i);

			a = GetLL(i);
			if (mc + a > mm) {
				mm = mc + a;
			}

			a = GetLL(i);
			if (a > mm) {
				mm = a;
			}

			a = GetLL(i);
			mc += a;

			a = GetLL(i);
			if (a > mc) {
				mc = a;
			}
		}
	}

	printf("%lld\n", mm);
	return 0;
}