Description
Input
Output
Sample Input
5 3 1 5 1 2 6 3 1 3 5 2 7 7 2 4 6 1 9 9 8 6 5 0 6 9 3 9 1 2
Sample Output
5
#include<iostream> #include<cstring> #include<cstdio> #define ll(x) (1<<x) #define clr(f,z) memset(f,z,sizeof(f)) #define FOR(i,a,b) for(int i=a;i<=b;++i) using namespace std; const int mm=255; int rmqb[mm][mm][9][9],rmqm[mm][mm][9][9]; int f[mm][mm]; int N,B,K,bit[mm]; void initRMQ() { bit[0]=-1; FOR(i,1,mm-1)bit[i]=(i&(i-1))==0?bit[i-1]+1:bit[i-1]; FOR(i,1,N)FOR(j,1,N) rmqb[i][j][0][0]=rmqm[i][j][0][0]=f[i][j]; FOR(r,0,bit[N])FOR(c,0,bit[N]) if(r+c) for(int i=1;i+ll(r)-1<=N;++i) for(int j=1;j+ll(c)-1<=N;++j) { if(r) { rmqm[i][j][r][c]=min(rmqm[i][j][r-1][c],rmqm[i+ll(r-1)][j][r-1][c]); rmqb[i][j][r][c]=max(rmqb[i][j][r-1][c],rmqb[i+ll(r-1)][j][r-1][c]); } else { rmqm[i][j][r][c]=min(rmqm[i][j][r][c-1],rmqm[i][j+ll(c-1)][r][c-1]); rmqb[i][j][r][c]=max(rmqb[i][j][r][c-1],rmqb[i][j+ll(c-1)][r][c-1]); } } } int RMQ(int r1,int c1,int r2,int c2) { int t1,t2; t1=bit[r2-r1+1]; t2=bit[c2-c1+1]; r2-=ll(t1)-1; c2-=ll(t2)-1; int a,b,z; a=min(rmqm[r1][c1][t1][t2],rmqm[r2][c1][t1][t2]); b=min(rmqm[r1][c2][t1][t2],rmqm[r2][c2][t1][t2]); z=min(a,b); a=max(rmqb[r1][c1][t1][t2],rmqb[r2][c1][t1][t2]); b=max(rmqb[r1][c2][t1][t2],rmqb[r2][c2][t1][t2]); return max(a,b)-z; } int main() { while(~scanf("%d%d%d",&N,&B,&K)) { FOR(i,1,N)FOR(j,1,N) scanf("%d",&f[i][j]); initRMQ(); int r,c; while(K--) { scanf("%d%d",&r,&c); printf("%d\n",RMQ(r,c,r+B-1,c+B-1)); } } return 0; }