Pagini recente » Cod sursa (job #1175628) | Cod sursa (job #1341270) | Cod sursa (job #1262104) | Cod sursa (job #2568809) | Cod sursa (job #1043146)
#include<cstdio>
#include<cstring>
#define dim 1005
using namespace std;
int DX,DY;
short int A[dim][dim],MAX[dim][dim],MAX2[dim][dim],MINU[dim][dim],MINU2[dim][dim],deque[dim];int front,back,n,m,p,i,j,NR,MIN;
void check (int DX,int DY ) {
for(j=1; j<=m; ++j ) {
front=1;back=0;
for( i=1 ; i<=n ; ++i ) {
while(front <= back && A[i][j]>A[deque[back]][j])
--back;
deque[++back]= i;
if(deque[front]==i-DX)
front++;
if(i>=DX)
MAX[i-DX+1][j]=A[deque[front]][j];
}
}
for( i=1; i<=n; ++i) {
front=1;back=0;
for( j=1 ;j<=m; ++j) {
while(front <= back && MAX[i][j]>MAX[i][deque[back]])
--back;
deque[++back]=j;
if(deque[front]==j-DY)
++front;
if(j>=DY)
MAX2[i][j-DY+1]=MAX[i][deque[front]];
}
}
for(j=1; j<=m; ++j ) {
front=1;back=0;
for( i=1 ; i<=n ; ++i ) {
while(front <= back && A[i][j]<A[deque[back]][j])
--back;
deque[++back]=i;
if(deque[front]==i-DX)
front++;
if(i>=DX)
MINU[i-DX+1][j]=A[deque[front]][j];
}
}
for( i=1; i<=n; ++i) {
front=1;back=0;
for( j=1 ;j<=m; ++j) {
while(front <= back && MINU[i][j]<MINU[i][deque[back]])
--back;
deque[++back]=j;
if(deque[front]==j-DY)
++front;
if(j>=DY)
MINU2[i][j-DY+1]=MINU[i][deque[front]];
}
}
for(i=1;i<=n-DX+1;++i) {
for(j=1;j<=m-DY+1; ++j ) {
if(MIN>MAX2[i][j]-MINU2[i][j]){
MIN=MAX2[i][j]-MINU2[i][j];
NR=1;
}
else
if(MIN==MAX2[i][j]-MINU2[i][j])
NR++;
}
}
}
int main (){
freopen("struti.in","r",stdin);
freopen("struti.out","w",stdout);
scanf("%d%d%d",&n,&m,&p);
for( i=1 ; i<=n ; ++i )
for( j=1 ; j<=m ;++j)
scanf("%d",&A[i][j]);
for(;p;--p) {
scanf("%d%d",&DX,&DY);
MIN=0x3f3f3f3f;
check(DX,DY);
if(DX!=DY){
check(DY,DX);
}
printf("%d %d\n",MIN,NR);
}
return 0;
}