// http://acm.hdu.edu.cn/showproblem.php?pid=1024
//状态:
//状态转移方程: dp[i][j]=max{dp[i][j-1]+A[j],dp[i-1][t]+a[j] (i-1<=t<n-m+i) }
//关于状态转移方程的解释:
// 的最大值.
// 以下用滚动数组进行DP
// 在求 dp[i][j]时也顺便把 max{dp[i - 1][t]} ( i - 1 <= t < j) 求出来,这样的话
// 时间复杂度仅为 O(N*(N - M + 1)) , 空间为 O( N )
#include<iostream>
#include<stdio.h>
#include<string.h>
using namespace std;
#define MAXN 1000000
int num[MAXN+50],now[MAXN+50],pre[MAXN+50];
int max(int a,int b)
{
if(a>b) return a;
return b;
}
int main()
{
int m,n,i,j,k,ans,max_pre;
while(cin>>m>>n)
{
for(i=1;i<=n;i++)
{
scanf("%d",&num[i]); //数据太多所以用scanf
}
memset(now,0,sizeof(now));
memset(pre,0,sizeof(pre));
for(i=1;i<=m;i++)
{
max_pre=(-1)*(MAXN*90);
for(j=i;j<=n;j++)
{
now[j]=max(now[j-1]+num[j],pre[j-1]+num[j]);
pre[j-1]=max_pre;
if(now[j]>max_pre)
{
max_pre=now[j];
}
}
}
cout<<max_pre<<endl;
}
return 0;
}