Pagini recente » Cod sursa (job #1843849) | Cod sursa (job #2271700) | Cod sursa (job #385447) | Cod sursa (job #1387619) | Cod sursa (job #1160406)
#include<stdio.h>
#include<deque>
#define INF 1002
using namespace std;
int h[INF][INF],Max[INF][INF],Min[INF][INF],n,m,p,minH,nr;
deque<int> maxQ,minQ;
void getRas(int r,int c)
{
for(int i=0; i<n; ++i)
{
minQ.clear();
maxQ.clear();
for(int j=0; j<m; ++j)
{
while(minQ.size()>0 && h[i][j]<=h[i][minQ.back()])minQ.pop_back();
minQ.push_back(j);
if(minQ.front()<=j-c)minQ.pop_front();
if(j>=c-1)Min[i][j]=h[i][minQ.front()];
while(maxQ.size()>0 && h[i][j]>=h[i][maxQ.back()])maxQ.pop_back();
maxQ.push_back(j);
if(maxQ.front()<=j-c)maxQ.pop_front();
if(j>=c-1)Max[i][j]=h[i][maxQ.front()];
}
}
for(int j=c-1; j<m; ++j)
{
minQ.clear();
maxQ.clear();
for(int i=0; i<n; ++i)
{
while(minQ.size()>0 && Min[i][j]<=Min[minQ.back()][j])minQ.pop_back();
minQ.push_back(i);
if(minQ.front()<=i-r)minQ.pop_front();
while(maxQ.size()>0 && Max[i][j]>=Max[maxQ.back()][j])maxQ.pop_back();
maxQ.push_back(i);
if(maxQ.front()<=i-r)maxQ.pop_front();
if(i>=r-1)
{
if(Max[maxQ.front()][j]-Min[minQ.front()][j]<minH)
{
minH=Max[maxQ.front()][j]-Min[minQ.front()][j];
nr=1;
}
else if(Max[maxQ.front()][j]-Min[minQ.front()][j]==minH)nr++;
}
}
}
}
int main()
{
freopen("struti.in","r",stdin);
freopen("struti.out","w",stdout);
scanf("%d%d%d",&n,&m,&p);
for(int i=0; i<n; ++i)
for(int j=0; j<m; ++j)scanf("%d",&h[i][j]);
for(int i=0; i<p; ++i)
{
int c,r;
minH=9999999999999999;
scanf("%d%d",&c,&r);
getRas(r,c);
if(c!=r)getRas(c,r);
printf("%d %d\n",minH,nr);
}
return 0;
}