#include<bits/stdc++.h>
using namespace std;
int TOP=10;
int a[5100][5100];
long long val[5100];
int dis[5100];
int n;
int m;
long long ans;
struct KT
{
    int st[5100];
	int which;
	int top;
    void PJ(int x)
	{	
		which=x;
	}
    void XN(int x)
	{
        while(top&&a[st[top]][which]<=a[x][which])
		{
            val[st[top]]-=a[st[top]][which];
            if(top>1)
            val[st[top-1]]+=a[st[top]][which];
            --top;
        }
        st[++top]=x;
        val[st[top]]+=a[st[top]][which];
        if (top>1)
        val[st[top-1]]-=a[st[top]][which];
    }
}St[5100];
int main()
{
    long long sum;
    cin>>n>>m;
    for(int i=1;i<n;i++) 
	scanf("%d",dis+i);
    memset(val,0,sizeof(val));
    for(int i=1;i<=n;i++)
    {
    	for(int j=1;j<=m;j++)
    	{
    		cin>>a[i][j];
    	}
    }
    for(int i=1;i<=m;i++) 
	St[i].PJ(i);
    for(int l=n;l>=1;--l)
	{
        for(int i=1;i<=m;i++)
        St[i].XN(l);
        sum=0;
        for(int r=l;r<=n;r++)
		{
            sum+=val[r];
            ans=max(ans,sum);
            sum-=dis[r];
        }
    }
    cout<<ans;
}