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

using namespace std;

int n, kompy, ID, poczatek, koniec;
long long a, suma, prefiks, sufiks, result, wynik, RES, WYN;

long long sumy[105];
long long prefiksy[105];
long long sufiksy[105];
long long resulty[105];

long long lewe[105];
long long prawe[105];

int main ()
{
	n = GetN();
	kompy = NumberOfNodes();
	ID = MyNodeId();
	poczatek = (n / kompy) * ID;
	koniec = (n / kompy) * (ID + 1);
	if (ID == kompy - 1) koniec = n;
	for (int i = poczatek; i < koniec; ++i)
	{
		a = GetTaste(i);
		suma += a;
		if (suma > prefiks) prefiks = suma;
		wynik += a;
		if (wynik < result) result = wynik;
		if (wynik > 0) wynik = 0;
	}
	result = suma - result;
	wynik = 0;
	for (int i = koniec - 1; i >= poczatek; --i)
	{
		a = GetTaste(i);
		wynik += a;
		if (wynik > sufiks) sufiks = wynik;
	}
	PutLL(0, suma);
	PutLL(0, prefiks);
	PutLL(0, sufiks);
	PutLL(0, result);
	Send(0);
	if (ID == 0)
	{
		for (int i = 0; i < kompy; ++i)
		{
			Receive(i);
			sumy[i] = GetLL(i);
			prefiksy[i] = GetLL(i);
			sufiksy[i] = GetLL(i);
			resulty[i] = GetLL(i);
		}
		lewe[0] = sumy[0];
		for (int i = 1; i < kompy; ++i) lewe[i] = lewe[i - 1] + sumy[i];
		prawe[kompy - 1] = sumy[kompy - 1];
		for (int i = kompy - 2; i >= 0; --i) prawe[i] = prawe[i + 1] + sumy[i];
		for (int i = 0; i < kompy; ++i) for (int j = i + 1; j < kompy; ++j)
		{
			WYN = prefiksy[i] + sufiksy[j];
			if (i != 0) WYN = lewe[i - 1];
			if (j != kompy - 1) WYN += prawe[j + 1];
			if (WYN > RES) RES = WYN;
		}
		for (int i = 0; i < kompy; ++i)
		{
			WYN = resulty[i];
			if (i != 0) WYN += lewe[i - 1];
			if (i != kompy - 1) WYN += prawe[i + 1];
			if (WYN > RES) RES = WYN;
		}
		printf("%lld\n", RES);
	}
	return 0;
}