Pagini recente » Cod sursa (job #1956670) | Cod sursa (job #1228725) | Cod sursa (job #1265269) | Cod sursa (job #2673492) | Cod sursa (job #1065237)
#include<cstdio>
#include<deque>
#include<utility>
using namespace std;
typedef pair<int,int> PII;
const int NMAX = 1005;
const int MMAX = 1005;
const int oo = (1<<31)-1;
int N,M,P,Dx,Dy;
int A[NMAX][MMAX];
deque<PII> ColMin[MMAX],ColMax[MMAX];
deque<PII> LinMin[NMAX],LinMax[NMAX];
int solve(int X,int Y,int &NR)
{
int MIN,i,j,d;
NR=0;
MIN=oo;
if(X>N || Y>M) return 0;
for(j=1;j<=M;j++)
{
ColMax[j].resize(0);
ColMin[j].resize(0);
}
for(j=1;j<=M;j++)
for(i=1;i<=X-1;i++)
{
for(;!ColMax[j].empty() && ColMax[j].back().second<=A[i][j];) ColMax[j].pop_back();
ColMax[j].push_back(make_pair(i,A[i][j]));
for(;!ColMin[j].empty() && ColMin[j].back().second>=A[i][j];) ColMin[j].pop_back();
ColMin[j].push_back(make_pair(i,A[i][j]));
}
for(;i<=N;i++)
{
LinMax[i].resize(0);
LinMin[i].resize(0);
for(j=1;j<=M;j++)
{
for(;!ColMax[j].empty() && ColMax[j].back().second<=A[i][j];) ColMax[j].pop_back();
ColMax[j].push_back(make_pair(i,A[i][j]));
for(;ColMax[j].front().first<=i-X;) ColMax[j].pop_front();
for(;!ColMin[j].empty() && ColMin[j].back().second>=A[i][j];) ColMin[j].pop_back();
ColMin[j].push_back(make_pair(i,A[i][j]));
for(;ColMin[j].front().first<=i-X;) ColMin[j].pop_front();
for(;!LinMax[i].empty() && LinMax[i].back().second<=ColMax[j].front().second;) LinMax[i].pop_back();
LinMax[i].push_back(make_pair(j,ColMax[j].front().second));
for(;LinMax[i].front().first<=j-Y;) LinMax[i].pop_front();
for(;!LinMin[i].empty() && LinMin[i].back().second>=ColMin[j].front().second;) LinMin[i].pop_back();
LinMin[i].push_back(make_pair(j,ColMin[j].front().second));
for(;LinMin[i].front().first<=j-Y;) LinMin[i].pop_front();
if(j>=Y)
{
d=LinMax[i].front().second-LinMin[i].front().second;
if(d<MIN) {MIN=d; NR=0;}
if(d==MIN) NR++;
}
}
}
return MIN;
}
int main()
{
int i,j;
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]);
int MIN1,MIN2;
int NR1,NR2;
int sol1,sol2;
for(;P;--P)
{
scanf("%d%d",&Dx,&Dy);
MIN1=solve(Dx,Dy,NR1);
if(Dx!=Dy)
{
MIN2=solve(Dy,Dx,NR2);
if(MIN1<MIN2) {sol1=MIN1; sol2=NR1;}
if(MIN1>MIN2) {sol1=MIN2; sol2=NR2;}
if(MIN1==MIN2) {sol1=MIN1; sol2=NR1+NR2;}
}
else
{
sol1=MIN1;
sol2=NR1;
}
printf("%d %d\n",sol1,sol2);
}
return 0;
}