1、 下面这段代码是 O(abn) 的吗?
2、如果是,那么如何不吸氧过此题?
#include<bits/stdc++.h>
using namespace std;
const int N=1002;
int a,b,n,m[N][N],ans=2e9;
int mn[N][N],mx[N][N];
struct que{
int val[N],head=0,tail=1;
inline int size(){return head-tail+1;}
inline int front(){return val[head];}
inline int back(){return val[tail];}
inline void pop_front(){--head;}
inline void pop_back(){++tail;}
inline void push_front(int x){val[++head]=x;};
inline void push_back(int x){val[--tail]=x;}
}qmn[N],qmx[N];
template<typename T>inline void read(T &ret){
ret=0;T fh=1;char ch=getchar();
while(ch>'9'||ch<'0'){if(ch=='-')fh=-1;ch=getchar();}
while(ch>='0'&&ch<='9')ret=(ret<<1)+(ret<<3)+(ch^48),ch=getchar();
ret*=fh;
}
int main(){
read(a);read(b);read(n);
for(int i=1;i<=a;++i)
for(int j=1;j<=b;++j){
read(m[i][j]);
mx[i][j]=mn[i][j]=m[i][j];
}
for(int j=1;j<=b;++j){
for(int i=1;i<=a;i++){
while(qmn[i].size()&&m[i][qmn[i].front()]>=m[i][j])qmn[i].pop_front();
while(qmn[i].size()&&qmn[i].back()<=j-n)qmn[i].pop_back();
qmn[i].push_front(j);
while(qmx[i].size()&&m[i][qmx[i].front()]<=m[i][j])qmx[i].pop_front();
while(qmx[i].size()&&qmx[i].back()<=j-n)qmx[i].pop_back();
qmx[i].push_front(j);
if(j>=n&&i>=n){
for(int k=1;k<=n;++k){
int x=i-n+k,y=j-n+1,p=i-n+1;
mn[p][y]=min(mn[p][y],m[x][qmn[x].back()]);
mx[p][y]=max(mx[p][y],m[x][qmx[x].back()]);
}
}
}
}
for(int i=1;i<=a-n+1;++i)
for(int j=1;j<=b-n+1;++j)
ans=min(ans,mx[i][j]-mn[i][j]);
printf("%d\n",ans);
return 0;
}