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
#include<bits/stdc++.h>
#include "kanapka.h"
#include "message.h"

using namespace std;

#define int long long

int32_t main() {
    ios_base::sync_with_stdio( 0 );
    cin.tie( 0 );

    //if( MyNodeId() != 0 ) return 0;

    int res = 0;
    int n = GetN();
    int suma = 0;
    int pref = 0, suf = 0;

    int przedzial = (n+10)/10;
    for( int a, i=MyNodeId()*przedzial; i<(MyNodeId()+1)*przedzial && i<n; i++ ) {
        a = GetTaste( i );
        //cout << a << "\n";
        res = max( a+res, pref );
        suma += a;
        pref = max( pref, suma );
        suf = min( suf, suma );
        //cout << a << " " << res << "\n";
    }


    PutLL( 0, res );
    PutLL( 0, suma );
    PutLL( 0, pref ); //zjedzony prefix
    PutLL( 0, suma-suf ); //zjedzony sufix
    Send( 0 );

    if( MyNodeId() != 0 ) {

        return 0;
    }

    int sum[15], pre[15], su[15], re[15];
    for( int i=0; i<10; i++ ) {
        Receive( i );
        re[i] = GetLL( i );
        sum[i] = GetLL( i );
        pre[i] = GetLL( i );
        su[i] = GetLL( i );
    }

    suma = sum[0];
    for( int i=1; i<10; i++ ) {
        pre[i] = max( pre[i-1], pre[i]+suma );
        suma += sum[i];
    }
    suma = sum[9];
    for( int i=8; i>=0; i-- ) {
        su[i] = max( su[i+1], su[i]+suma );
        suma += sum[i];
    }
    res = 0;
    for( int i=0; i<10; i++ ) {
        for( int j=i+1; j<10; j++ ) {
            res = max( res, pre[i]+su[j] );
        }
    }

    for( int i=0; i<10; i++ ) {
        res = max( res, re[i]+suma-sum[i] );
    }

    cout << res;


    return 0;
}