#include <bits/stdc++.h>
using namespace std;
int n, m, h[2001][2001], mini = 1000000000;
bool czy(int x) {
bool odp = false; int dp[n+2][4], res[4][2];
dp[0][0] = dp[n+1][2] = m, dp[0][1] = dp[n+1][3] = 1;
res[0][0] = res[1][0] = res[2][0] = res[3][0] = -1000000000;
res[0][1] = res[1][1] = res[2][1] = res[3][1] = 1000000000;
for (int i = 1; i <= n; i++) {
dp[i][0] = 0, dp[i][1] = m+1;
for (int j = 1; j <= dp[i-1][0]; j++) {
if (h[i][j] <= mini+x)
dp[i][0]++;
else
break;
}
for (int j = m; j > dp[i][0]; j--)
res[0][0] = max(res[0][0],h[i][j]), res[0][1] = min(res[0][1],h[i][j]);
for (int j = m; j >= dp[i-1][1]; j--) {
if (h[i][j] <= mini+x)
dp[i][1]--;
else
break;
}
for (int j = 1; j < dp[i][1]; j++)
res[1][0] = max(res[1][0],h[i][j]), res[1][1] = min(res[1][1],h[i][j]);
}
for (int i = n; i >= 1; i--) {
dp[i][2] = 0, dp[i][3] = m+1;
for (int j = 1; j <= dp[i+1][2]; j++) {
if (h[i][j] <= mini+x)
dp[i][2]++;
else
break;
}
for (int j = m; j > dp[i][2]; j--)
res[2][0] = max(res[2][0],h[i][j]), res[2][1] = min(res[2][1],h[i][j]);
for (int j = m; j >= dp[i+1][3]; j--) {
if (h[i][j] <= mini+x)
dp[i][3]--;
else
break;
}
for (int j = 1; j < dp[i][3]; j++)
res[3][0] = max(res[3][0],h[i][j]), res[3][1] = min(res[3][1],h[i][j]);
}
return (min({res[0][0]-res[0][1],res[1][0]-res[1][1],res[2][0]-res[2][1],res[3][0]-res[3][1]}) <= x);
}
int main() {
ios_base::sync_with_stdio(0);
cin.tie(0); cout.tie(0);
cin >> n >> m;
for (int i = 1; i <= n; i++)
for (int j = 1; j <= m; j++)
cin >> h[i][j], mini = min(mini,h[i][j]);
int l = 0, r = 1000000000;
while (l < r) {
int s = (l+r)/2;
if (czy(s))
r = s;
else
l = s+1;
}
cout << l << endl;
return 0;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |