#include <bits/stdc++.h>
using namespace std;
#define forn(i,n) for(int i=0;i<int(n);i++)
#define forsn(i,s,n) for(int i=int(s);i<int(n);i++)
#define dforn(i,n) for(int i=int(n)-1;i>=0;i--)
#define dforsn(i,s,n) for(int i=int(n)-1;i>=int(s);i--)
#define fst first
#define snd second
#define pb push_back
#define eb emplace_back
#define sz(x) (int)x.size()
#define all(x) x.begin(), x.end()
typedef long long ll;
typedef vector<ll> vll;
typedef vector<int> vi;
typedef pair<int,int> ii;
const int INF=1e9+20;
vector<vi> rotate(const vector<vi> &a){
int h=sz(a),w=sz(a[0]);
vector<vi> b(w,vi(h));
forn(i,h) forn(j,w){
b[w-j-1][i]=a[i][j];
}
return b;
}
int main(){
ios::sync_with_stdio(0);
cin.tie(0);
int h,w;
cin>>h>>w;
vector<vi> a(h,vi(w));
forn(i,h) forn(j,w){
cin>>a[i][j];
}
int mini=INF,maxi=-INF;
forn(i,sz(a)) forn(j,sz(a[0])){
mini=min(mini,a[i][j]);
maxi=max(maxi,a[i][j]);
}
vector<vi> r[4];
forn(t,4){
r[t]=a;
a=rotate(a);
}
vector<vi> suff[4];
forn(t,4){
int n=sz(r[t]),m=sz(r[t][0]);
suff[t].assign(n,vi(m+1));
forn(i,n){
suff[t][i][m]=-INF;
dforn(j,m) suff[t][i][j]=max(suff[t][i][j+1],r[t][i][j]);
}
}
auto check=[&](int d){
forn(t,4){
int n=sz(r[t]),m=sz(r[t][0]);
bool flag=maxi-r[t][0][0]<=d&&r[t][n-1][m-1]-mini<=d;
if(!flag) continue;
int p=m;
forn(i,n){
int j=0;
while(j<p&&maxi-r[t][i][j]<=d) j++;
if(suff[t][i][j]-mini>d){
flag=false;
break;
}
p=j;
}
if(flag) return true;
}
return false;
};
int lo=-1,hi=maxi-mini;
while(hi-lo>1){
int mid=(lo+hi)/2;
if(check(mid)) hi=mid;
else lo=mid;
}
cout<<hi<<'\n';
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... |