Pagini recente » Cod sursa (job #956409) | Cod sursa (job #1244735) | Cod sursa (job #2837347) | Cod sursa (job #1292822) | Cod sursa (job #1728929)
#include<cstdio>
#define MAXN 1010
#define INF 100000
using namespace std;
int n,m,answer,options;
int h[MAXN][MAXN],Min[MAXN][MAXN],Max[MAXN][MAXN];
struct Stack{
int line;
int column;
};
Stack MinStack[MAXN],MaxStack[MAXN];
void Compute(int dx,int dy){
int i,j,minLeft,minRight,maxLeft,maxRight,value;
for(j=1;j<=m;j++){
minLeft=maxLeft=minRight=maxRight=1;
MinStack[1].line=MaxStack[1].line=1;
MinStack[1].column=MaxStack[1].column=j;
Min[1][j]=Max[1][j]=h[1][j];
for(i=2;i<=n;i++){
while(MinStack[minLeft].line<=i-dx)
minLeft++;
while(minRight>=minLeft&&h[MinStack[minRight].line][MinStack[minRight].column]>=h[i][j])
minRight--;
minRight++;
MinStack[minRight].line=i;
MinStack[minRight].column=j;
while(MaxStack[maxLeft].line<=i-dx)
maxLeft++;
while(maxRight>=maxLeft&&h[MaxStack[maxRight].line][MaxStack[maxRight].column]<=h[i][j])
maxRight--;
maxRight++;
MaxStack[maxRight].line=i;
MaxStack[maxRight].column=j;
Min[i][j]=h[MinStack[minLeft].line][MinStack[minLeft].column];
Max[i][j]=h[MaxStack[maxLeft].line][MaxStack[maxLeft].column];
}
}
for(i=dx;i<=n;i++){
minLeft=maxLeft=minRight=maxRight=1;
MinStack[1].line=MaxStack[1].line=i;
MinStack[1].column=MaxStack[1].column=1;
for(j=2;j<=m;j++){
while(MinStack[minLeft].column<=j-dy)
minLeft++;
while(minLeft<=minRight&&Min[MinStack[minLeft].line][MinStack[minLeft].column]>=Min[i][j])
minRight--;
minRight++;
MinStack[minRight].line=i;
MinStack[minRight].column=j;
while(MaxStack[maxLeft].column<=j-dy)
maxLeft++;
while(maxLeft<=maxRight&&Max[MaxStack[maxLeft].line][MaxStack[maxLeft].column]<=Max[i][j])
maxRight--;
maxRight++;
MaxStack[maxRight].line=i;
MaxStack[maxRight].column=j;
if(j>=dy){
value=Max[MaxStack[maxLeft].line][MaxStack[maxLeft].column]-Min[MinStack[minLeft].line][MinStack[minLeft].column];
if(value<answer){
answer=value;
options=1;
}
else
if(value==answer)
options++;
}
}
}
}
int main(){
freopen("struti.in","r",stdin);
freopen("struti.out","w",stdout);
int i,j,dx,dy,p;
scanf("%d%d%d",&n,&m,&p);
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
scanf("%d",&h[i][j]);
for(i=1;i<=p;i++){
scanf("%d%d",&dx,&dy);
answer=INF;
Compute(dx,dy);
if(dx!=dy)
Compute(dy,dx);
printf("%d %d\n",answer,options);
}
return 0;
}