This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <bits/stdc++.h>
#define mp make_pair
#define pb push_back
#define pii pair<int,int>
#define LL long long
#define st first
#define nd second
#define endl '\n'
using namespace std;
const int MAXN=2005;
int a[MAXN][MAXN],n,m,ans=1e9,mx,mn,idx,l,r,add,mnn,b[MAXN][MAXN],used[MAXN*MAXN],rr;
int kk[MAXN][MAXN];
pair<int,pii> c[MAXN*MAXN];
void rotate1() {
//cout<<"fuk"<<endl;
for(int i=0;i<n;++i)
for(int j=0;j<m;++j) {
b[i][m-j-1]=a[i][j];
}
for(int i=0;i<n;++i)
for(int j=0;j<m;++j) {
a[i][j]=b[i][j];
}
for(int i=0;i<n;++i)
for(int j=0;j<m;++j) {
b[i][m-j-1]=kk[i][j];
}
for(int i=0;i<n;++i)
for(int j=0;j<m;++j) {
kk[i][j]=b[i][j];
}
}
void rotate2() {
for(int i=0;i<n;++i)
for(int j=0;j<m;++j) {
b[n-i-1][j]=a[i][j];
}
for(int i=0;i<n;++i)
for(int j=0;j<m;++j) {
a[i][j]=b[i][j];
}
for(int i=0;i<n;++i)
for(int j=0;j<m;++j) {
b[n-i-1][j]=kk[i][j];
}
for(int i=0;i<n;++i)
for(int j=0;j<m;++j) {
kk[i][j]=b[i][j];
}
}
int solve() {
memset(used,0,sizeof used);
/*for(int i=0;i<n;++i) {
for(int j=0;j<m;++j) {
cout<<a[i][j]<<" ";
}
cout<<endl;
}*/
l=0,r=n*m-1;
int ret=1e9;
int x,y;
mn=1e9+1;
for(int i=0;i<n;++i)
for(int j=0;j<m;++j) {
if(mn>a[i][j]) {
mn=a[i][j];
x=i;
y=j;
}
}
//cout<<"xd"<<endl;
mx=0;
//cout<<x<<" "<<y<<" "<<mpp.size()<<endl;
int up[MAXN];
int cnt=0;
memset(up,0,sizeof up);
for(int j=0;j<=x;++j) {
up[j]=y+1;
for(int i=0;i<=y;++i) {
mx=max(mx,a[j][i]);
used[kk[j][i]]=1;
while(l!=r&&used[l])
++l;
while(l!=r&&used[r])
--r;
++cnt;
}
}
priority_queue<pii> pq;
for(int i=0;i<n;++i) {
if(up[i]!=m) {
if(i&&up[i]==up[i-1])
continue;
pq.push(mp(-a[i][up[i]],i));
}
}
if(!pq.empty()) ret=min(ret,max(mx-mn,c[r].st-c[l].st));
//cout<<"xd"<<endl;
pii dd;
int val;
while(!pq.empty()) {
add=-1,mnn=1e9+1;
dd=pq.top();
pq.pop();
add=dd.nd;
val=-dd.st;
mx=max(mx,val);
used[kk[add][up[add]]]=1;
while(l!=r&&used[l])
++l;
while(l!=r&&used[r])
--r;
++up[add];
if(up[add]!=m) {
if(add!=0&&up[add]==up[add-1]);
else pq.push(mp(-a[add][up[add]],add));
}
if(add+1!=n&&up[add+1]==up[add]-1)
pq.push(mp(-a[add+1][up[add+1]],add+1));
if(!pq.empty()) ret=min(ret,max(mx-mn,c[r].st-c[l].st));
}
//cout<<"rekt"<<endl;
return ret;
}
int main() {
srand(time(NULL));
scanf("%d %d",&n,&m);
for(int i=0;i<n;++i)
for(int j=0;j<m;++j) {
scanf("%d",&a[i][j]);
c[i*m+j]=mp(a[i][j],mp(i,j));
}
sort(c,c+n*m);
for(int i=0;i<n*m;++i)
kk[c[i].nd.st][c[i].nd.nd]=i;
if(rand()%13!=2) ans=min(ans,solve());
rotate1();
//cout<<"malahmet"<<endl;
if(rand()%13!=2) ans=min(ans,solve());
rotate2();
if(rand()%13!=2) ans=min(ans,solve());
rotate1();
if(rand()%13!=2) ans=min(ans,solve());
printf("%d\n",ans);
}
Compilation message (stderr)
joioi.cpp: In function 'int main()':
joioi.cpp:139:22: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
scanf("%d %d",&n,&m);
^
joioi.cpp:142:24: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
scanf("%d",&a[i][j]);
^
joioi.cpp: In function 'int solve()':
joioi.cpp:70:8: warning: 'y' may be used uninitialized in this function [-Wmaybe-uninitialized]
int x,y;
^
joioi.cpp:86:15: warning: 'x' may be used uninitialized in this function [-Wmaybe-uninitialized]
for(int j=0;j<=x;++j) {
^
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |