样例负数qwq
#include<bits/stdc++.h>
using namespace std;
int a[1005][1005],maxx;
int mn_min[1005][1005],mn_max[1005][1005];
int r_min[1005][1005],r_max[1005][1005];
deque<int> q;
int minn=0x3f3f3f3f;
int main(){
int n,m,k;
cin>>n>>m>>k;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cin>>a[i][j];
}
}
for(int i=1;i<=n;i++){
q.clear();
for(int j=1;j<=m;j++){
while(!q.empty()&&a[i][q.back()]>=a[i][j]){
q.pop_back();
}
q.push_back(j);
if(q.front()<j-k+1){
q.pop_front();
}
if(j>=k){
r_min[i][j]=a[i][q.front()];
}
}
}
for(int j=k;j<=m;j++){
q.clear();
for(int i=1;i<=n;i++){
while(!q.empty()&&r_min[q.back()][j]>=r_min[i][j]){
q.pop_back();
}
q.push_back(i);
if(q.front()<i-k+1){
q.pop_front();
}
if(j>=k){
mn_min[i][j]=r_min[q.front()][j];
}
}
}
for(int i=1;i<=n;i++){
q.clear();
for(int j=1;j<=m;j++){
while(!q.empty()&&a[i][q.back()]<=a[i][j]){
q.pop_back();
}
q.push_back(j);
if(q.front()<j-k+1){
q.pop_front();
}
if(j>=k){
r_max[i][j]=a[i][q.front()];
}
}
}
for(int j=k;j<=m;j++){
q.clear();
for(int i=1;i<=n;i++){
while(!q.empty()&&a[q.back()][j]>=a[i][j]){
q.pop_back();
}
q.push_back(i);
if(q.front()<j-k+1){
q.pop_front();
}
if(j>=k){
mn_max[i][j]=r_max[q.front()][j];
minn=min(minn,mn_max[i][j]-mn_min[i][j]);
}
}
}
// for(int i=1;i<=n;i++){
// for(int j=1;j<=m;j++){
// cout<<r_min[i][j]<<" ";
// }
// cout<<endl;
// }
// cout<<endl;
// for(int i=1;i<=n;i++){
// for(int j=1;j<=m;j++){
// cout<<r_max[i][j]<<" ";
// }
// cout<<endl;
// }
cout<<minn;
return 0;
}
/*大概的思路是:
先用单调队列求出r_min[i][j]表示a[i][j]到a[i][j+y-1]中的最小值
再用单调队列求出mn[i][j]表示r_min[i][j]到r_min[i+x-1][j] 中的最小值 */