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
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
#include <cstdio>
#include <iostream>
#include <vector>
#include <algorithm>

#include "kanapka.h"
#include "message.h"

using namespace std;

typedef vector<int> VI;
typedef long long LL;

#define FOR(x, b, e) for(int x = b; x <= (e); ++x)
#define FORD(x, b, e) for(int x = b; x >= (e); --x)
#define REP(x, n) for(int x = 0; x < (n); ++x)
#define VAR(v, n) __typeof(n) v = (n)
#define ALL(c) (c).begin(), (c).end()
#define SIZE(x) ((int)(x).size())
#define FOREACH(i, c) for(VAR(i, (c).begin()); i != (c).end(); ++i)
#define PB push_back
#define ST first
#define ND second
#define MP make_pair


int main() {

  LL n, q, i, i0, i1, t, s, s0, l0, r0, best;
  int m, nr;

  vector<LL> a, l;

  n=GetN();
  m=NumberOfNodes();
  nr=MyNodeId();

  q=n/(m-1);
//  p=n%(m-1);
  i0=nr*q;
  i1=i0+q;
  if (nr==m-1) i1=n;

  a.reserve(q);
  l.reserve(q);

  s=l0=0;

  for (i=i0; i<i1; i++) {
    t=GetTaste(i);
    a.PB(t);
    s+=t;
    if (s>l0) l0=s;
    l.PB(l0);
  }



  if(l0==s) {
    PutLL(0,s);
    PutLL(0,0);
    PutLL(0,0);
    Send(0);
    if (nr>0) return 0;
    goto RAZEM;
  }

  s0=s; s=0; r0=0; best=l0;

  for (i=a.size()-1; i>0; i--) {
   s+=a[i];
   if (s+l[i-1]>best) {
    r0=s;
    l0=l[i-1];
    best=l0+s;
   }
  }

  PutLL(0,l0);
  PutLL(0,s0-l0-r0);
  PutLL(0,r0);
  Send(0);
  if (nr>0) return 0;


RAZEM:

 s=l0=0;
 a.clear();
 l.clear();

 REP(i,nr) {
  Receive(i);
  REP(j,3) {
   t=GetLL(i);
   a.PB(t);
   s+=t;
   if (s>l0) l0=s;
   l.PB(l0);
  }
 }

 s0=s; s=0; r0=0; best=l0;

 for (i=a.size()-1; i>0; i--) {
  s+=a[i];
  if (s+l[i-1]>best) {
   r0=s;
   l0=l[i-1];
   best=l0+s;
  }
 }

 cout<<best<<endl;
 return 0;

}