#include <bits/stdc++.h>
#include <random>
using namespace std;
using ll = long long;
using ld = long double;
ll INF = 1e18;
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
ll n, m;
cin >> n >> m;
vector<vector<ll>> s(n, vector<ll>(m));
for (ll i = 0; i < n; i++) {
for (ll j = 0; j < m; j++) {
cin >> s[i][j];
}
}
ll ans = INF;
{
vector<ll> z(m);
ll l = 0, r = 2e9;
while (r - l > 1) {
ll mid = (r + l) / 2;
for (ll i = 0; i < m; i++) {
z[i] = 0;
}
for (ll i = 0; i < m; i++) {
for (ll j = 0; j < n; j++) {
if (s[j][i] <= mid) {
z[i] = j;
}
}
}
ll vl = n;
for (ll i = 0; i < m; i++) {
if (z[i] != 0) {
vl = i;
break;
}
}
ll vr = -1;
for (ll i = m - 1; i >= 0; i--) {
if (z[i] != 0) {
vr = i;
break;
}
}
vr++;
ll mx = 0;
ll mn = INF;
for (ll i = vl; i < vr; i++) {
for (ll j = 0; j <= z[i]; j++) {
mx = max(mx, s[j][i]);
mn = min(mn, s[j][i]);
}
}
ll d1 = mx - mn;
ll mx1 = 0, mn1 = INF;
for (ll i = 0; i < vl; i++) {
for (ll j = 0; j < n; j++) {
mx1 = max(mx1, s[j][i]);
mn1 = min(mn1, s[j][i]);
}
}
for (ll i = vr; i < m; i++) {
for (ll j = 0; j < n; j++) {
mx1 = max(mx1, s[j][i]);
mn1 = min(mn1, s[j][i]);
}
}
for (ll i = vl; i < vr; i++) {
for (ll j = z[i] + 1; j < n; j++) {
mx1 = max(mx1, s[j][i]);
mn1 = min(mn1, s[j][i]);
}
}
ll d2 = mx1 - mn1;
ans = min(ans, max(d1, d2));
if (d1 < d2) {
l = mid;
} else {
r = mid;
}
}
}
for (ll i = 0; i < n / 2; i++) {
swap(s[i], s[n - 1 - i]);
}
{
vector<ll> z(m);
ll l = 0, r = 2e9;
while (r - l > 1) {
ll mid = (r + l) / 2;
for (ll i = 0; i < m; i++) {
z[i] = 0;
}
for (ll i = 0; i < m; i++) {
for (ll j = 0; j < n; j++) {
if (s[j][i] <= mid) {
z[i] = j;
}
}
}
ll vl = n;
for (ll i = 0; i < m; i++) {
if (z[i] != 0) {
vl = i;
break;
}
}
ll vr = -1;
for (ll i = m - 1; i >= 0; i--) {
if (z[i] != 0) {
vr = i;
break;
}
}
vr++;
ll mx = 0;
ll mn = INF;
for (ll i = vl; i < vr; i++) {
for (ll j = 0; j <= z[i]; j++) {
mx = max(mx, s[j][i]);
mn = min(mn, s[j][i]);
}
}
ll d1 = mx - mn;
ll mx1 = 0, mn1 = INF;
for (ll i = 0; i < vl; i++) {
for (ll j = 0; j < n; j++) {
mx1 = max(mx1, s[j][i]);
mn1 = min(mn1, s[j][i]);
}
}
for (ll i = vr; i < m; i++) {
for (ll j = 0; j < n; j++) {
mx1 = max(mx1, s[j][i]);
mn1 = min(mn1, s[j][i]);
}
}
for (ll i = vl; i < vr; i++) {
for (ll j = z[i] + 1; j < n; j++) {
mx1 = max(mx1, s[j][i]);
mn1 = min(mn1, s[j][i]);
}
}
ll d2 = mx1 - mn1;
ans = min(ans, max(d1, d2));
if (d1 < d2) {
l = mid;
} else {
r = mid;
}
}
}
cout << ans;
}
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |