#include <stdio.h>
#include <time.h>
#include <math.h>
#include <stdlib.h>
#include <string.h>
#include <map> 
#include <string>
#include <vector>  
#include <iostream> 
#include <sstream> 
#include <queue>
#include <algorithm>
#include <assert.h>
#include "kanapka.h"
#include "message.h"

using namespace std;
 
#define ll long long
#define PB 		push_back
#define FOR(a,start,end) 	for(int a=int(start); a<int(end); a++)
#define INF 		INT_MAX
#define SORT(a) 	sort(a.begin(),a.end()) 
#define CL(a,x) 		memset(a,x,sizeof(a))
#define REP(a,x)	for(int a=0;a<x;a++)
#define REP1(a,x)	for(int a=1;a<=x;a++)
#define MP 		make_pair

 
 
typedef vector<int>     vi;
typedef pair<int,int>     pii; 
typedef vector<string> vs;
typedef vector<pii> vii;
typedef vector<vector<int> > vvi;
typedef vector<vector<string> > vvs;
typedef vector<pair<string,string> > vss;
typedef pair<string,string> pss; 
typedef pair<int,pii> ppii;
typedef vector<ppii> vppii;
typedef vector<vector<pii> > vvii;
typedef vector<vvi> vvvi;


int nz,m;
ll n,k,k1,k2,a,b,c;
vector<ll> vk,va,vb,vc0,vc1,vc2;

int main() {  
	//freopen( "c:\\wojtek\\uva\\pa\\debug\\t1.in", "rt", stdin);  
	
	//pi=2*acos(0.0);
	 
	m=MyNodeId();
	nz=NumberOfNodes();
	
	n = GetN();
	if(n<nz){
		if(m==0){
			k1=0;
			k2=n-1;
			vk.clear();
			va.assign(k2-k1+1,0ll);
			vb.assign(k2-k1+1,0ll);
			for(ll i=k1;i<=k2;i++){
				a=GetTaste(i);
				vk.push_back(a);
			}
			cerr<<"m =0 1"<<endl;
			a=0;
			va[0]=vk[0];
			a=max(a,va[0]);
			for(int i=1;i<=(int)(k2-k1);i++){
				va[i]=va[i-1]+vk[i];
				a=max(a,va[i]);
			}
		//	cerr<<"m =0 2"<<endl;
			b=0;
			vb[(int)(k2-k1)]=vk[(int)(k2-k1)];
			b=max(b,vb[(int)(k2-k1)]);
			for(int i=(int)(k2-k1-1);i>=0;i--){
				vb[i]=vb[i+1]+vk[i];
				b=max(b,vb[i]);
			}
		//	cerr<<"m =0 3 "<<endl;
			a=0;
		
			for(int i=0;i<n;i++){
				if(i==0)
					b=0;
				else
					b=va[i-1];
			
				for(int j=i;j<n;j++){
					if(j==n)
						c=0;
					else
						c=vb[j];
					
					a=max(a,b+c);
				}
				a=max(a,va[n-1]);
			}
		//	cerr<<"m =0 4"<<endl;
			cout<<a<<endl;
		}
	}
	else {
		k=n/nz;    //ile przedziałów z każdej instancji

		k1=m*k;
		k2=(m+1)*k-1;
		if(m==nz-1)
			k2=n-1;
		vk.clear();
		va.assign(k2-k1+1,0ll);
		vb.assign(k2-k1+1,0ll);
		for(ll i=k1;i<=k2;i++){
			a=GetTaste(i);
			vk.push_back(a);
		}
		a=0;
		va[0]=vk[0];
		a=max(a,va[0]);
		for(int i=1;i<=(int)(k2-k1);i++){
			va[i]=va[i-1]+vk[i];
			a=max(a,va[i]);
		}
		b=0;
		vb[(int)(k2-k1)]=vk[(int)(k2-k1)];
		b=max(b,vb[(int)(k2-k1)]);
		for(int i=(int)(k2-k1-1);i>=0;i--){
			vb[i]=vb[i+1]+vk[i];
			b=max(b,vb[i]);
		}
		if(m>0){
			PutLL(0,a);
			PutLL(0,va[(int)(k2-k1)]);
			PutLL(0,b);
			cerr<<"node "<<m<<" sent "<<a<<" "<<va[(int)(k2-k1)]<<" "<<b<<" to node 0"<<endl;
			Send(0);
		}
		else {
			vc0.clear();
			vc1.clear();
			vc2.clear();

			
			vc0.push_back(a);
			vc1.push_back(va[(int)(k2-k1)]);
			vc2.push_back(b);
			for(int i=1;i<nz;i++){
				Receive(i);
				a=GetLL(i);
				c=GetLL(i);
				b=GetLL(i);
				cerr<<"node "<<m<<" received "<<a<<" "<<c<<" "<<b<<" from node: "<<i<<endl;
				vc0.push_back(a);
				vc1.push_back(c);
				vc2.push_back(b);
			}
			
			va.assign(nz+1,0ll);
			vb.assign(nz+1,0ll);

			va[0]=0;
		//	va[0]=vc1[0];
			for(int i=1;i<nz;i++){
				va[i]=va[i-1]+vc1[i-1];
			}
			vb[nz]=0;
		//	vb[nz-1]=vc1[nz-1];
			for(int i=nz-1;i>=0;i--){
				vb[i]=vb[i+1]+vc1[i];
			}
			a=0;
		
			for(int i=0;i<nz;i++){
			//	if(i==0)
			//		b=0;
			//	else
					b=va[i];
				b+=vc0[i];
				for(int j=i;j<nz;j++){
			//		if(j==nz-1)
			//			c=0;
			//		else
						c=vb[j+1];
					c+=vc2[j];
					a=max(a,b+c);
				}
			}
			cout<<a<<endl;
		}
	
		
	}
	




	
	//czas = clock() - czas;
	//printf("%lf\n",double(czas)/CLOCKS_PER_SEC);					
//}
			
	return 0;
	 
} 
