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

using namespace std;

void sendToFirst(long long sum, long long maximum, long long minimum, long long best) {
    PutLL(0, sum);
    PutLL(0, maximum);
    PutLL(0, minimum);
    PutLL(0, best);
    Send(0);
}

void receiveAndCombine(int nodeId, long long &sum, long long &maximum, long long &minimum, long long &best) {
    long long nextSum, nextMaximum, nextMinimum, nextBest;
    Receive(nodeId);
    nextSum = GetLL(nodeId);
    nextMaximum = GetLL(nodeId);
    nextMinimum = GetLL(nodeId);
    nextBest = GetLL(nodeId);

    nextMaximum += sum;
    nextMinimum += sum;
    sum += nextSum;
    best = min(min(best, nextBest), nextMinimum - maximum);
    minimum = min(minimum, nextMinimum);
    maximum = max(maximum, nextMaximum);
}

int main() {
    int n = GetN();
    int nodes = NumberOfNodes();
    int partSize = n / nodes;
    int myId = MyNodeId();

    long long sum = 0, maximum = 0, minimum = 0, best = 0;
    for(int i = myId * partSize; i < (myId == nodes - 1? n : (myId + 1) * partSize); ++i) {
        sum += GetTaste(i);
        maximum = max(sum, maximum);
        minimum = min(sum, minimum);
        best = min(best, sum - maximum);
    }

    if(myId == 0) {
        for(int i = 1; i < nodes; ++i) {
            receiveAndCombine(i, sum, maximum, minimum, best);
        }
        printf("%lld\n", sum - best);
    } else {
        sendToFirst(sum, maximum, minimum, best);
    }

    return 0;
}