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

using namespace std;

int main()
{
    if (MyNodeId() > 0) {
        long long MachineItems = 0;
        Receive(0);
        MachineItems = GetLL(0);
        for (long long ActionID = 0; ActionID < MachineItems; ActionID++)
        {
            bool Reverse = false;
            long long Overall = 0;
            long long ItemsLength = 0;
            Receive(0);
            ItemsLength = GetLL(0);
            for (long long CurrentItem = 0; CurrentItem < ItemsLength; CurrentItem++)
            {
                if (!Reverse)
                {
                    Overall = Overall + GetTaste(CurrentItem);
                }
                else
                {
                    Overall = Overall + GetTaste(ItemsLength - CurrentItem);
                }
                Reverse = !Reverse;
            }
            Send(0);
            PutLL(0, Overall);
        }
    }
    else
    {
        int MachinesCount = NumberOfNodes();
        long long ItemsLength = GetN();
        long long MachineItems = ItemsLength / MachinesCount;
        long long MachinesOverallItems = ItemsLength;
        for (long long MachineID = 1; MachineID < MachinesCount; MachineID++)
        {
            if (MachinesOverallItems > MachineItems)
            {
                Send(MachineID);
                PutLL(MachineID, MachineItems);
            }
            else
            {
                Send(MachineID);
                PutLL(MachineID, MachinesOverallItems);
            }
            MachinesOverallItems = MachinesOverallItems - MachineItems;
        }
        long long FirstItemCount = 0;
        for (long long MachineID = 1; MachineID < MachinesCount; MachineID++)
        {
            Send(MachineID);
            PutLL(MachineID, FirstItemCount);
            FirstItemCount++;
        }
        long long MaxResult = LLONG_MIN;
        long long MachineFID = 1;
        for (long long ItemCount = FirstItemCount; ItemCount < ItemsLength; ItemCount++)
        {
            if (MachineFID > (MachinesCount - 1))
            {
                MachineFID = 1;
            }
            Receive(MachineFID);
            if (GetLL(MachineFID) > MaxResult)
            {
               MaxResult = GetLL(MachineFID);
            }
            Send(MachineFID);
            PutLL(MachineFID, ItemCount);
            MachineFID++;
        }
        cout << MaxResult;
    }
    return 0;
}