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
85
86
87
#include "maklib.h"
#include "message.h"
#include <stdio.h>

#define MIN_ROZPR   10
#define MAKS_WEZ    100

int main()
{
    long long suma, suma_pocz, suma_maks, suma_kon, pocz, kon, wez_pocz[MAKS_WEZ], wez_kon[MAKS_WEZ], wez_maks[MAKS_WEZ], wez_suma[MAKS_WEZ];
    int i, j, licz, n, licz_wez, nr_wez, czy_rozpr;

    licz_wez = NumberOfNodes();
    nr_wez = MyNodeId();
    n = Size();
    czy_rozpr = n / licz_wez >= MIN_ROZPR;
    if (czy_rozpr || nr_wez == 0)
    {
        suma = suma_pocz = suma_maks = suma_kon = 0;
        if (czy_rozpr)
        {
            pocz = nr_wez * n / licz_wez + 1;
            kon = (nr_wez + 1) * n / licz_wez;
        }
        else
        {
            pocz = 1;
            kon = n;
        }
        for (i = pocz; i <= kon; i++)
        {
            licz = ElementAt(i);
            suma += licz;
            if (suma > suma_pocz)
                suma_pocz = suma;
            if (suma_kon < 0 && licz > 0)
                suma_kon = licz;
            else
                suma_kon += licz;
            if (suma_kon > suma_maks)
                suma_maks = suma_kon;
        }
        if (czy_rozpr)
        {
            if (nr_wez > 0)
            {
                PutLL(0, suma_pocz);
                PutLL(0, suma_maks);
                PutLL(0, suma);
                PutLL(0, suma_kon);
                Send(0);
            }
            else
            {
                for (i = 1; i < licz_wez; i++)
                {
                    j = Receive(-1);
                    wez_pocz[j] = GetLL(j);
                    wez_maks[j] = GetLL(j);
                    wez_suma[j] = GetLL(j);
                    wez_kon[j] = GetLL(j);
                }
                for (i = 1; i < licz_wez; i++)
                {
                    if (suma_kon > suma)
                        suma = suma_kon;
                    if (wez_maks[i] > suma_maks)
                        suma_maks = wez_maks[i];
                    if (suma + wez_pocz[i] > suma_maks)
                        suma_maks = suma + wez_pocz[i];
                    if (suma + wez_suma[i] > wez_kon[i])
                    {
                        suma += wez_suma[i];
                        if (suma > suma_maks)
                            suma_maks = suma;
                    }
                    else
                        suma = wez_kon[i];
                    suma_kon = wez_kon[i];
                }
            }
        }
        if (nr_wez == 0)
            printf("%lld\n", suma_maks);
    }
    return 0;
}