badge:
一维静态RMQ?st表。
好的你变成了二维。
没事,二维st表。
#include<cstdio>
using namespace std;
const int LG=8;
const int inf=0x7f7f7f7f;
int n,m;
int st1[256][256][LG][LG];
int st2[256][256][LG][LG];
int a[256][256];
int maxf(int x,int y){return x>y?x:y;}
int minf(int x,int y){return x<y?x:y;}
int logn[256];
void prepare()
{
int i,j,k,_n,_m,h,l;
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
st1[i][j][0][0]=st2[i][j][0][0]=a[i][j];
logn[1]=0;
for(i=2;i<=255;i++)logn[i]=logn[i>>1]+1;
_n=logn[n];_m=logn[m];
for(h=0;h<=_n;h++)
{
for(l=0;l<=_m;l++)
{
if(!h&&!l)continue;
for(i=1;i<=n;i++)
{
for(j=1;j<=m;j++)
{
if(l)st1[i][j][h][l]=maxf(st1[i][j][h][l-1],st1[i][j+(1<<(l-1))][h][l-1]);
else st1[i][j][h][l]=maxf(st1[i][j][h-1][l],st1[i+(1<<(h-1))][j][h-1][l]);
if(l)st2[i][j][h][l]=minf(st2[i][j][h][l-1],st2[i][j+(1<<(l-1))][h][l-1]);
else st2[i][j][h][l]=minf(st2[i][j][h-1][l],st2[i+(1<<(h-1))][j][h-1][l]);
}
}
}
}
return;
}
int x2,y2,ans;
int querymax(int x,int y,int h,int l)
{
x2=x+h-1,y2=y+l-1;
h=logn[h];l=logn[l];ans=-inf;
ans=maxf(st1[x][y][h][l],st1[x][y2-(1<<l)+1][h][l]);
ans=maxf(ans,maxf(st1[x2-(1<<h)+1][y][h][l],st1[x2-(1<<h)+1][y2-(1<<l)+1][h][l]));
return ans;
}
int querymin(int x,int y,int h,int l)
{
x2=x+h-1,y2=y+l-1;
h=logn[h];l=logn[l];ans=inf;
ans=minf(st2[x][y][h][l],st2[x][y2-(1<<l)+1][h][l]);
ans=minf(ans,minf(st2[x2-(1<<h)+1][y][h][l],st2[x2-(1<<h)+1][y2-(1<<l)+1][h][l]));
return ans;
}
int main()
{
int i,j,k,x,y,z,q,b;
scanf("%d%d%d",&n,&b,&q);
m=n;
for(i=1;i<=n;i++)
{
for(j=1;j<=m;j++)
scanf("%d",&a[i][j]);
}
prepare();
for(i=1;i<=q;i++)
{
scanf("%d%d",&x,&y);
printf("%d
",querymax(x,y,b,b)-querymin(x,y,b,b));
}
return 0;
}