This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
// Success consists of going from failure to failure without loss of enthusiasm
#include <bits/stdc++.h>
using namespace std;
#define nl '\n'
int main() {
cin.tie(0)->sync_with_stdio(0);
int N, M; cin >> N >> M;
vector<vector<int>> A(N, vector<int>(M)); for(auto& v : A) for(auto& x : v) cin >> x;
vector<int> U;
vector<array<int, 3>> I;
for(int i = 0; i < N; i++) for(int j = 0; j < M; j++) {
U.push_back(A[i][j]);
I.push_back({A[i][j], i, j});
}
sort(rbegin(I), rend(I));
sort(begin(U), end(U));
U.erase(unique(begin(U), end(U)), end(U));
auto solve = [&]() {
vector<vector<int>> P(N, vector<int>(M));
vector<int> JOI;
for(auto i : I) P[i[1]][i[2]] = i[0];
for(int i = 0; i < N; i++) for(int j = 0; j < M; j++) {
if (i != 0) P[i][j] = min(P[i][j], P[i-1][j]);
if (j != 0) P[i][j] = min(P[i][j], P[i][j-1]);
}
JOI = U;
int ans = int(1e9);
int mn = ans, mx = -ans;
for(int i = 0; i < int(size(I)); i++) {
int j = i;
while(j < int(size(I)) && I[i][0] == I[j][0]) {
int r = I[j][1], c = I[j][2];
mn = min(mn, P[r][c]);
j++;
}
mx = max(mx, I[i][0]);
JOI.pop_back();
if (size(JOI) == 0) break;
// cout << I[i][0] << endl;
// for(auto x : JOI) cout << x << " ";
// cout << endl;
// for(auto x : IOI) cout << x << " ";
// cout << endl;
int res = max(JOI.back() - JOI.front(), mx - mn);
// cout << range(JOI) << " " << range(IOI) << endl;
ans = min(ans, res);
i = j-1;
}
return ans;
};
int ans = int(1e9);
for(int f1 = 0; f1 < 2; f1++) {
for(int f2 = 0; f2 < 2; f2++) {
// cout << 2 * f1 + f2 << nl;
ans = min(ans, solve());
for(auto &i : I) i[2] = M - 1 - i[2];
}
for(auto &i : I) i[1] = N - 1 - i[1];
}
cout << ans << nl;
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... |