#include<bits/stdc++.h>
using namespace std;
const int MAXN=2025;
int f[MAXN],val[MAXN][MAXN],P[MAXN][MAXN],V[MAXN*MAXN];
pair<int,int> pos[MAXN*MAXN];
bool ck[MAXN*MAXN];
bool comp(pair<int,int> a,pair<int,int> b)
{
return val[a.first][a.second]<val[b.first][b.second];
}
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int n,m;
cin>>n>>m;
int cnt=0;
for(int i=1;i<=n;i++) for(int j=1;j<=m;j++)
{
cin>>val[i][j];
pos[++cnt]={i,j};
}
sort(pos+1,pos+n*m+1,comp);
for(int i=1;i<=n*m;i++) P[pos[i].first][pos[i].second]=i,V[i]=val[pos[i].first][pos[i].second];
int ans=V[n*m]-V[1],mx=0,r=1;
for(int i=1;i<=n*m;i++)
{
for(int j=pos[i].first;j>0&&f[j]<pos[i].second;j--) while(f[j]<pos[i].second) ck[P[j][++f[j]]]=true,mx=max(mx,val[j][f[j]]);
while(ck[r]) r++;
if(r<=n*m) ans=min(ans,max(mx-V[1],V[n*m]-V[r]));
}
for(int i=1;i<=n*m;i++) ck[i]=false;
for(int i=1;i<=n;i++) f[i]=0;
mx=0,r=1;
for(int i=1;i<=n*m;i++)
{
for(int j=pos[i].first;j<=n&&f[j]<pos[i].second;j++) while(f[j]<pos[i].second) ck[P[j][++f[j]]]=true,mx=max(mx,val[j][f[j]]);
while(ck[r]) r++;
if(r<=n*m) ans=min(ans,max(mx-V[1],V[n*m]-V[r]));
}
for(int i=1;i<=n*m;i++) ck[i]=false;
for(int i=1;i<=n;i++) f[i]=m+1;
mx=0,r=1;
for(int i=1;i<=n*m;i++)
{
for(int j=pos[i].first;j>0&&f[j]>pos[i].second;j--) while(f[j]>pos[i].second) ck[P[j][--f[j]]]=true,mx=max(mx,val[j][f[j]]);
while(ck[r]) r++;
if(r<=n*m) ans=min(ans,max(mx-V[1],V[n*m]-V[r]));
}
for(int i=1;i<=n*m;i++) ck[i]=false;
for(int i=1;i<=n;i++) f[i]=m+1;
mx=0,r=1;
for(int i=1;i<=n*m;i++)
{
for(int j=pos[i].first;j<=n&&f[j]>pos[i].second;j++) while(f[j]>pos[i].second) ck[P[j][--f[j]]]=true,mx=max(mx,val[j][f[j]]);
while(ck[r]) r++;
if(r<=n*m) ans=min(ans,max(mx-V[1],V[n*m]-V[r]));
}
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... |