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
88
89
90
91
92
93
94
95
96
97
98
#include "message.h"
#include "maklib.h"

#include <iostream>
using namespace std;

int main() {
    int n_of_nodes = NumberOfNodes();
    int size = Size();
    int my_id = MyNodeId();
    
    if(size <= n_of_nodes && my_id == 0){
        long long int akt_sum, max_sum, tmp;
        akt_sum = max_sum = 0;
    
        for(int i=1;i<=size; i++){
            tmp = ElementAt(i);
            akt_sum += tmp;
            if(akt_sum > max_sum){
                max_sum = akt_sum;
            }
            if(akt_sum < 0)
                akt_sum = 0;
        }
    
    cout << max_sum << "\n";
    }
    else if(size > n_of_nodes){
        int begin, end;
        begin = (size * my_id) / n_of_nodes + 1;
        end = (size * (my_id + 1)) / n_of_nodes;
           
        long long int akt_sum, max_sum, tmp, sum_before, sum_after, sum_tmp, sum_before_tmp, sum_old;
        akt_sum = max_sum = sum_before = sum_after = sum_before_tmp = sum_tmp = 0;
        sum_old = 0;
        
        for(int i=begin; i<=end; i++){
            tmp = ElementAt(i);
            akt_sum += tmp;
            
            if(akt_sum > 0 && sum_old == 0 || akt_sum == 0)
                sum_before_tmp = sum_tmp;
            
            sum_tmp += tmp;
            sum_after += tmp;
            if(akt_sum > max_sum){
                max_sum = akt_sum;
                sum_after = 0;
                sum_before = sum_before_tmp;
            }
            if(akt_sum < 0){
                akt_sum = 0;
            }
            
            sum_old = akt_sum;
        }
        
        if(my_id > 0){
            PutLL(0, sum_before);
            PutLL(0, max_sum);
            PutLL(0, sum_after);
            //PutInt(0, begin);
            //PutInt(0, end);
            Send(0);
        }
        else{
            //cout << begin << endl;
            //cout << end << endl;
            
            /*cout << sum_before << endl;
            cout << max_sum << endl;
            cout << sum_after << endl;
            cout << endl;*/
                    
            
            for (int instancja = 1; instancja < NumberOfNodes(); ++instancja) {
              Receive(instancja);
              
              for(int i=0;i<3;i++){
                  akt_sum += GetLL(instancja);
                  if(akt_sum > max_sum){
                    max_sum = akt_sum;
                  }
                    if(akt_sum < 0)
                        akt_sum = 0;
              }
              
              /*cout << "instancja " << instancja << ":" << endl;
              cout << GetInt(instancja) << endl;
              cout << GetInt(instancja) << endl;
              cout << GetInt(instancja) << endl;*/
            }
            cout << max_sum << endl;
        }
    }

    return 0;
}