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
#include "maklib.h"
#include "message.h"

#include <algorithm>
#include <iostream>
using namespace std;

int main()
{
  int ja=MyNodeId(), poczatek=(ja*(long long) Size())/NumberOfNodes(), koniec=((ja+1LL)*Size())/NumberOfNodes();
  long long lewa=0, minLewa=0, prawa=0, srodek=0, wszystko=0, biez=0;
  for (int i=poczatek; i<koniec; ++i)
  {
    int x=ElementAt(i+1);
    wszystko+=x;
    lewa=max(lewa, wszystko);
    minLewa=min(minLewa, wszystko);
    biez=max(biez+x, 0LL);
    srodek=max(srodek, biez);
  }
  prawa=max(0LL, wszystko-minLewa);
  
  if (ja>0)
  {
    Receive(ja-1);
    long long pPrawa=GetLL(ja-1), pSrodek=GetLL(ja-1);
    srodek=max(pSrodek, max(srodek, pPrawa+lewa));
    prawa=max(prawa, wszystko+pPrawa);
  }
  if (ja<NumberOfNodes()-1)
  {
    PutLL(ja+1, prawa);
    PutLL(ja+1, srodek);
    Send(ja+1);
  }
  if (ja==NumberOfNodes()-1)
    cout<<srodek<<endl;
    
  return 0;
}