不开O2AC,开了O2全RE
#include <bits/stdc++.h>
#define N 1005
using namespace std;
int n,m,l;
int a[N][N];
int dp[N][N][12],dp2[N][N][12];
int t[N][2];
int init(){
for(int i=1;i<=m;i++){
for(int j=1;j<=n;j++){
dp[i][j][0]=dp2[i][j][0]=a[j][i];
}
}
for(int i=1;i<=m;i++){
for(int k=1;k<=11;k++){
for(int j=1;j+(1<<k)-1<=n;j++){
dp[i][j][k]=max(dp[i][j][k-1],dp[i][j+(1<<(k-1))][k-1]);
dp2[i][j][k]=min(dp2[i][j][k-1],dp2[i][j+(1<<(k-1))][k-1]);
}
}
}
}
int q_max(int j,int l,int r){
int k=log2(r-l+1);
return max(dp[j][l][k],dp[j][r-(1<<k)+1][k]);
}
int q_min(int j,int l,int r){
int k=log2(r-l+1);
return min(dp2[j][l][k],dp2[j][r-(1<<k)+1][k]);
}
int query(int k){
int ANS=1e9;
for(int i=1;i+k-1<=n;i++){
int l=i,r=i+k-1;
for(int j=1;j<=m;j++){
t[j][0]=q_max(j,l,r);
t[j][1]=q_min(j,l,r);
}
deque<int> q,q2;
for(int j=1;j<=m;j++){
while(!q.empty()&&q.front()+k-1<j)
q.pop_front();
while(!q.empty()&&t[q.back()][0]<t[j][0])
q.pop_back();
q.push_back(j);
while(!q2.empty()&&q2.front()+k-1<j)
q2.pop_front();
while(!q2.empty()&&t[q2.back()][1]>t[j][1])
q2.pop_back();
q2.push_back(j);
if(j>=k) ANS=min(ANS,t[q.front()][0]-t[q2.front()][1]);
}
}
return ANS;
}
int main(){
cin>>n>>m>>l;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
scanf("%d",&a[i][j]);
}
}
init();
cout<<query(l);
}