#include<bits/stdc++.h>
using namespace std;
#define ll long long

stack<ll> st[210];

ll num[5010][210],dis[5010],pre[5010],res[5010],c[5010],n,m,ans;

inline ll rd()
{
	ll x=0;char ch=getchar();
	for (;ch<'0'||ch>'9';ch=getchar());
	for (;ch>='0'&&ch<='9';ch=getchar()) x=x*10+ch-'0';
	return x;
}

int main()
{
	n=rd();m=rd();
	for (int i=2;i<=n;i++) dis[i]=rd();
	for (int i=2;i<=n;i++) pre[i]=pre[i-1]+dis[i];
	for (int i=1;i<=n;i++) for (int j=1;j<=m;j++) num[i][j]=rd();
	for (int i=1;i<=m;i++) res[1]+=num[1][i],st[i].push(1LL);
	ans=res[1];
	for (int i=2;i<=n;i++)
	{
		for (int j=1;j<=m;j++) res[i]+=num[i][j];
		c[i-1]=res[i-1];
		for (int j=i-2;j;j--) c[j]=res[j]-res[j+1];
		for (int j=1;j<=m;j++)
		{
			ll nxt=i-1;
			while (!st[j].empty()&&num[st[j].top()][j]<=num[i][j])
			{
				ll hh=st[j].top();st[j].pop();
				c[nxt]+=num[i][j]-num[hh][j];
				if (!st[j].empty()) c[st[j].top()]-=num[i][j]-num[hh][j];
				if (!st[j].empty()) nxt=st[j].top();
			}
			st[j].push(i);
		}
		res[i-1]=c[i-1];
		for (int j=i-2;j;j--) res[j]=res[j+1]+c[j];
		for (int j=1;j<=i;j++)
		{
			ans=max(ans,res[j]-(pre[i]-pre[j]));
		}
	}
	printf("%lld\n",ans);
	return 0;
}