#include <bits/stdc++.h>
using namespace std;
#ifdef LOCAL
#include "debug.h"
#else
#define dbg(...) 47
#endif
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n, m;
cin >> n >> m;
vector<vector<int>> a(n, vector<int>(m));
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
cin >> a[i][j];
}
}
int mn = 1e9, mx = 0;
for (int i = 0; i < n; i++) {
mn = min(mn, ranges::min(a[i]));
mx = max(mx, ranges::max(a[i]));
}
auto is = [&](vector<vector<int>> b) {
vector<int> l(n), r(n);
for (int i = 0; i < n; i++) {
int j = 0;
while (j < m && (b[i][j] & 1)) {
l[i]++;
r[i]++;
j++;
}
j--;
while (j >= 0 && b[i][j] == 3) {
l[i]--;
j--;
}
for (int j = r[i] + 1; j < m; j++) {
if (b[i][j] == 1) return false;
}
}
int cur = l[0];
for (int i = 1; i < n; i++) {
if (cur > r[i]) {
return false;
}
if (l[i] > cur) {
cur = l[i];
}
}
return true;
};
auto good = [&](int k) {
vector<vector<int>> b(n, vector<int>(m));
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
if (a[i][j] - mn <= k) {
b[i][j] += 1;
}
if (mx - a[i][j] <= k) {
b[i][j] += 2;
}
if (b[i][j] == 0) {
return false;
}
}
}
if (is(b)) {
return true;
}
ranges::reverse(b);
if (is(b)) {
return true;
}
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
if (b[i][j] == 1) {
b[i][j] = 2;
} else if (b[i][j] == 2) {
b[i][j] = 1;
}
}
}
if (is(b)) {
return true;
}
ranges::reverse(b);
return is(b);
};
int l = -1, r = mx - mn;
while (l + 1 < r) {
int m = (l + r) / 2;
if (good(m)) {
r = m;
} else {
l = m;
}
}
cout << r << '\n';
return 0;
}