#include <stdio.h>
//#include <conio.h> /////////////////////////////////////////////////////////////////////////////////////
#include "message.h"
//
//

#include "kanapka.h"
// long long GetN() - zwraca liczbę części kanapki
// long long GetTaste(i) - zwraca smakowitość (-10^9 => 10^9) i-tej części kanapki (i=0:N-1)

//Liczba wysłanych wiadomości przez jedną instancję < 1000
//Rozmiar wiadomości z jednej instancji < 8MB


int main()
{

if (MyNodeId() == 0)
	{
	long long N,WYNIK;
	N = GetN();
	
	Receive(1);
	int czy_wszystkie_dodatnie;
	czy_wszystkie_dodatnie=GetInt(1);
	
	Receive(2);
	long long SUMA_WSZYSTKICH;
	SUMA_WSZYSTKICH=GetLL(2);
	
	Receive(3);
	int min_left_pos;
	min_left_pos=GetInt(3);
	
	Receive(4);
	int min_right_pos;
	min_right_pos=GetInt(4);
	
	Receive(5);
	long long max_left;
	max_left=GetLL(5);
	
	Receive(6);
	long long max_right;
	max_right=GetLL(6);
	
	Receive(7);
	long long minimalna_suma_ujemnego_ciagu;
	minimalna_suma_ujemnego_ciagu=GetLL(7);
	
		
	if (czy_wszystkie_dodatnie==1)
		{
		WYNIK=SUMA_WSZYSTKICH;
		printf("%lld",WYNIK);
		return 0;
		}
	
	if (min_left_pos == N-1) 
		{
		WYNIK=max_left;
		if (WYNIK<0) WYNIK=0;
		printf("%lld",WYNIK);
		return 0;
		}
		
	if (min_right_pos == 0) 
		{
		WYNIK=max_right;
		if (WYNIK<0) WYNIK=0;
		printf("%lld",WYNIK);
		return 0;
		}
		
	WYNIK = SUMA_WSZYSTKICH - minimalna_suma_ujemnego_ciagu;
	printf("%lld",WYNIK);
	return 0;
	
	}
else if (MyNodeId() == 1)
	{ // Sprawdza, czy wszystkie elementy są dodatnie. Jeśli tak zwraca int=1, jeśli nie, to zwraca int=0
	long long N;
	N = GetN();
	int sa_dodatnie=1;
	for (int i=0; i<N; i++) if ( GetTaste(i) < 0 ) { sa_dodatnie=0; break; }
	if (sa_dodatnie==0) PutInt(0, 0); // <<===
	else PutInt(0, 1); // <<===
	Send(0);
	}
else if (MyNodeId() == 2)
	{ // Suma wszystkich elementów, a więc smakowitość całej kanapki. MUSI ZWRÓCIĆ LONG LONG - uwaga na duże liczby.
	long long N;
	N = GetN();
	long long SUMA=0;
	for (int i=0; i<N; i++) SUMA+=GetTaste(i);
	PutLL(0, SUMA);
	Send(0);
	}
else if (MyNodeId() == 3)
	{ // Ostatnia pozycja minimalnego patrząc od lewej
	long long N;
	N = GetN();
	long long SUMA,min_val;
	int min_pos;
	
	SUMA=GetTaste(0);
	min_val=SUMA;
	min_pos=0;
	for (int i=1; i<N; i++) 
		{
		SUMA+=GetTaste(i);
		if (SUMA<=min_val) 
			{
			min_val=SUMA;
			min_pos=i;
			}
		}
	PutInt(0, min_pos);
	Send(0);
	}
else if (MyNodeId() == 4)
	{// Ostatnia pozycja minimalnego patrząc od prawej
	long long N;
	N = GetN();
	long long SUMA,min_val;
	int min_pos;
	
	SUMA=GetTaste(N-1);
	min_val=SUMA;
	min_pos=N-1;
	for (int i=N-2; i>=0; i--)
		{
		SUMA+=GetTaste(i);
		if (SUMA<=min_val)
			{
			min_val=SUMA;
			min_pos=i;
			}
		}
	PutInt(0, min_pos);
	Send(0);
	}
else if (MyNodeId() == 5)
	{ //Wartość maksymalna (w sumach) patrząc od lewej strony
	long long N;
	N = GetN();
	long long SUMA,max_val;
	
	SUMA=GetTaste(0);
	max_val=SUMA;
	for (int i=1; i<N; i++)
		{
		SUMA+=GetTaste(i);
		if (SUMA>max_val) max_val=SUMA;
		}
	PutLL(0, max_val);
	Send(0);
	}
else if (MyNodeId() == 6)
	{ //Wartość maksymalna (w sumach) patrząc od prawej strony
	long long N;
	N = GetN();
	long long SUMA,max_val;
	
	SUMA=GetTaste(N-1);
	max_val=SUMA;
	for (int i=N-2; i>=0; i--)
		{
		SUMA+=GetTaste(i);
		if (SUMA>max_val) max_val=SUMA;
		}
	PutLL(0, max_val);
	Send(0);
	}
else if (MyNodeId() == 7)
	{ // Minimalna suma ujemnego ciagu
	long long N;
	N = GetN();
	long long SUMA,minimalna_suma_ujemnego_ciagu=0,chwil_suma[3];
	chwil_suma[0]=0; chwil_suma[1]=0; chwil_suma[2]=0;
	
	for (int i=0; i<N; i++)
		{
		long long TAB;
		TAB=GetTaste(i);
		if (TAB<0)
			{
			chwil_suma[2]+=TAB;
			}
		else if (TAB>0)
			{
			if (chwil_suma[2] < 0) //Tylko za pierwszym razem...
				{
				if (chwil_suma[0]+chwil_suma[1]+chwil_suma[2] < chwil_suma[2]) chwil_suma[0]=chwil_suma[0]+chwil_suma[1]+chwil_suma[2];
				else chwil_suma[0]=chwil_suma[2];
				chwil_suma[1]=0;
				chwil_suma[2]=0;
				if (chwil_suma[0] < minimalna_suma_ujemnego_ciagu) minimalna_suma_ujemnego_ciagu = chwil_suma[0];
				}
			chwil_suma[1]+=TAB;
			}
		if (i==N-1)
			{
			if (chwil_suma[0]+chwil_suma[1]+chwil_suma[2] < chwil_suma[2]) chwil_suma[0]=chwil_suma[0]+chwil_suma[1]+chwil_suma[2];
			else chwil_suma[0]=chwil_suma[2];
			
			if (chwil_suma[0] < minimalna_suma_ujemnego_ciagu) minimalna_suma_ujemnego_ciagu = chwil_suma[0];
			}
		}
	
	PutLL(0, minimalna_suma_ujemnego_ciagu);
	Send(0);
	}

return 0;
}





