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

#define FOR(i,a,b) for (int i = (a); i < (b); ++i)
#define FORD(i,b,a) for (int i = (int)(b) - 1; i >= a; --i)
#define REP(i,N) FOR(i,0,N)
#define st first
#define nd second
#define pb push_back

typedef pair<int, int> PII;
typedef long long LL;

int A[6000];
int B[6000][300];

LL increase[6000];
int increase_from[6000][300];
stack<int> increasing[300];

void set_increase_from(int i, int j, int to) {
  increase[i] += to - increase_from[i][j];
  increase_from[i][j] = to;
}

int main() {
  int N, M;
  scanf("%d%d", &N, &M);
  FOR(i,1,N) scanf("%d", &A[i]);

  REP(i,N)REP(j,M) scanf("%d", &B[i][j]);

  LL result = 0;
  FORD(i,N,0) {
    REP(j,M) {
      while (!increasing[j].empty() && B[increasing[j].top()][j] <= B[i][j]) {
        set_increase_from(increasing[j].top(), j, 0);
        increasing[j].pop();
      }
      if (!increasing[j].empty()) set_increase_from(increasing[j].top(), j, B[increasing[j].top()][j] - B[i][j]);
      increasing[j].push(i);
    }

    LL sum = 0;
    REP(j,M) sum += B[i][j];
    result = max(result, sum);
    FOR(j,i+1,N) {
      sum += increase[j];
      sum -= A[j];
      result = max(result, sum);
    }
  }

  printf("%lld\n", result);
}
