#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<ll>     vi;
typedef pair<ll,ll>     pii; 
typedef vector<string> vs;
typedef vector<pii> vii;
typedef vector<vector<ll> > vvi;
typedef vector<vector<string> > vvs;
typedef vector<pair<string,string> > vss;
typedef pair<string,string> pss; 
typedef pair<ll,pii> ppii;
typedef vector<ppii> vppii;
typedef vector<vector<pii> > vvii;
typedef vector<vvi> vvvi;


ll nz;
ll m,n,k,k1,k2,a,b,c,d;
vector<ll> vk,va,vb,vc0,vc1,vc2,vc3;
vi vam,vbm;

int main() {  
	//freopen( "c:\\wojtek\\uva\\pa\\debug\\t1.in", "rt", stdin);  
	
	//pi=2*acos(0.0);
	 
	m=(ll)MyNodeId();
	nz=(ll)NumberOfNodes();
	
	n = GetN();
	if(m==0)
		cerr<<"nz = "<<nz<<" n= "<<n<<endl;
	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);
			vam.assign(n+1,0ll);
			vbm.assign(n+1,0ll);
			for(ll i=k1;i<=k2;i++){
				a=GetTaste(i);
				vk.push_back(a);
				cerr<<a<<" ";
			}
			cerr<<endl;
			//cerr<<"m =0 1"<<endl; 
			a=0;
			vam[0]=0;
			va[0]=vk[0];
			a=max(a,va[0]);
			vam[1]=a;
			cerr<<vam[0]<<" "<<vam[1]<<" ";
			for(int i=1;i<=(int)(k2-k1);i++){
				va[i]=va[i-1]+vk[i];
				a=max(a,va[i]);
				vam[i+1]=a;
				cerr<<vam[i+1]<<" ";
			}
			cerr<<endl;
		//	cerr<<"m =0 2"<<endl;
			b=0;
			vb[(int)(k2-k1)]=vk[(int)(k2-k1)];
			b=max(b,vb[(int)(k2-k1)]);
			vbm[(int)(k2-k1+1)]=0;
			vbm[(int)(k2-k1)]=b;
			cerr<<vbm[0]<<" ";
			for(int i=(int)(k2-k1-1);i>=0;i--){
				vb[i]=vb[i+1]+vk[i];
				b=max(b,vb[i]);
				vbm[i]=b;
				cerr<<vbm[i]<<" ";
			}
			cerr<<endl;
		//	cerr<<"m =0 3 "<<endl;
			a=0;
		
			for(int i=0;i<n-1;i++){
				a=max(a,vam[i]+vbm[i+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();
		if(m==9)
			cerr<<m<<" k1,k2 = "<<k1<<" "<<k2<<endl;

		d=0;
		ll z;
		a=0ll;
	
		for(ll i=k1;i<=k2;i++){
			z=GetTaste(i);
			d+=z;
			a=max(d,a);
		
		}
		
		b=0ll;
		c=d;
		ll b1;
		b1=0;
		for(ll i=k2;i>=k1;i--){
			z=GetTaste(i);
			b1+=z;
			d-=z;
			b=max(b,b1);
			c=max(c,d+b);
			
		}
		
		if(m>0){
			if(m==9)
				cerr<<c<<endl;
			PutLL(0,a);
			PutLL(0,b);
			PutLL(0,c);
			PutLL(0,b1);
			
			cerr<<"node "<<m<<" sent "<<a<<" "<<b<<" "<<c<<" "<<b1<<" to node 0"<<endl;
			Send(0);
		}
		else {
			//cerr<<c<<endl;
			vc0.clear();	//od lewej
			vc1.clear();	//od rawej
			vc2.clear();	//z dwóch stron
			vc3.clear();	// całe
			
			vc0.push_back(a);
			vc1.push_back(b);
			vc2.push_back(c);
			vc3.push_back(b1);
			
			for(int i=1;i<(int)nz;i++){
				
				Receive(i);
				a=GetLL(i);
				b=GetLL(i);
				c=GetLL(i);
				d=GetLL(i);
				cerr<<"node "<<m<<" received "<<a<<" "<<b<<" "<<c<<" "<<d<<" from node: "<<i<<endl;
				vc0.push_back(a);
				vc1.push_back(b);
				vc2.push_back(c);
				vc3.push_back(d);
			}
			
			a=0;
			b=0;
			c=0;
			for(int i=0;i<(int)nz;i++){
				b=0;
				for(int j=(int)nz-1;j>i;j--){
					c=max(c,a+b+vc0[i]+vc1[j]);
					b+=vc3[j];
				}
				c=max(c,a+b+vc2[i]);
				a+=vc3[i];
				
			}
			
			cout<<c<<endl;
		}
	
		
	}
	




	
	//czas = clock() - czas;
	//printf("%lf\n",double(czas)/CLOCKS_PER_SEC);					
//}
			
	return 0;
	 
} 
