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

typedef long long LL;
const LL INF = 1e18;

void startowy()
{

	LL maxiL[100], maxiP[100], maxiIN[100], caly[100];
	int n = GetN();

	int ile = NumberOfNodes()-1;

	int start = 0;
	for(int i= 0;i<ile; ++i)
	{
		int dl = (n+i)/ile;
		
		PutInt(i+1,start);		
		start += dl;
		PutInt(i+1,start);
		Send(i+1);
	}
	
	for(int i = 0;i<ile; ++i)
	{
		int nr = Receive(i+1);
		maxiL[i] = GetLL(i+1);
		maxiP[i] = GetLL(i+1);
		maxiIN[i] =GetLL(i+1);
		caly[i] = GetLL(i+1);
		//printf("%lld %lld %lld %lld\n",maxiL[i], maxiP[i], maxiIN[i], caly[i]);
	}
	
	LL sufSum[100] = {};
	for(int i = ile-1; i >=0;--i)
		sufSum[i] = sufSum[i+1] + caly[i];
	
	LL maxSuf[100] = {};
	maxSuf[ile-1] =max(0ll, maxiP[ile-1]);
	for(int i = ile-2;i >= 0; --i)
		maxSuf[i] = max(maxSuf[i+1], sufSum[i+1] + maxiP[i]);
	
	LL res = -INF;
	
	LL prefSum = 0;
	LL maxPref= 0;
	for(int i = 0; i < ile; ++i)
	{
		
		res = max({res,maxPref + maxSuf[i], prefSum + maxiIN[i] + sufSum[i+1], prefSum + maxiL[i] + maxSuf[i+1], maxPref + maxiP[i] + sufSum[i+1]});
		
		maxPref = max(maxPref, prefSum + maxiL[i]);
		prefSum += caly[i];
	}
	printf("%lld\n", res);

}

void liczacy()
{
	Receive(0);
	int l =GetInt(0), p = GetInt(0);

//printf("jestem %d dostalem %d %d\n", MyNodeId(),l,p);

	LL maxiL = -INF, maxiIN = -INF, maxiP= -INF,suma= 0;
	vector<LL> maxi;
	for(int i= l; i < p; ++i)
	{
		suma += GetTaste(i);
		maxiL = max(maxiL,suma);
		maxi.push_back(maxiL);
	}
	suma = 0;
	int index =maxi.size()-1;
	for(int i= p-1; i >= l; --i, --index)
	{
		maxiIN = max(maxiIN, maxi[index] + maxiP);
		suma += GetTaste(i);
		maxiP = max(maxiP, suma);
	}

	maxiIN = max(maxiIN, suma);

	PutLL(0,maxiL);
	PutLL(0,maxiP);
	PutLL(0,maxiIN);
	PutLL(0,suma);
	Send(0);
}

int main()
{
	if(MyNodeId() == 0)
		startowy();

	else
		liczacy();

}