Pagini recente » Cod sursa (job #2863259) | Cod sursa (job #41632) | Cod sursa (job #806400) | Cod sursa (job #376531) | Cod sursa (job #1958477)
#include <cstdio>
#include <algorithm>
#include <deque>
#define INF 2000000000
#define MaxN 1001
using namespace std;
int N,M,P,X1,X2,v[MaxN][MaxN]={},MaxL[MaxN][MaxN]={},MaxC[MaxN][MaxN]={},MinL[MaxN][MaxN]={},MinC[MaxN][MaxN]={},Min,cnt;
deque <int> Qmax;
deque <int> Qmin;
void Solve(int v1,int v2)
{
for(int i=1;i<=N;i++)
{
Qmin.clear();
Qmax.clear();
for(int j=1;j<=M;j++)
{
while(!Qmax.empty()&&v[i][Qmax.back()]<v[i][j])
Qmax.pop_back();
Qmax.push_back(j);
if(Qmax.front()<=j-v1)
Qmax.pop_front();
if(j-v1>=0)
MaxL[i][j-v1+1]=v[i][Qmax.front()];
while(!Qmin.empty()&&v[i][Qmin.back()]>v[i][j])
Qmin.pop_back();
Qmin.push_back(j);
if(Qmin.front()<=j-v1)
Qmin.pop_front();
if(j-v1>=0)
MinL[i][j-v1+1]=v[i][Qmin.front()];
}
}
for(int j=1;j<=M-v1+1;j++)
{
Qmin.clear();
Qmax.clear();
for(int i=1;i<=N;i++)
{
while(!Qmax.empty()&&MaxL[Qmax.back()][j]<MaxL[i][j])
Qmax.pop_back();
Qmax.push_back(i);
if(Qmax.front()<=i-v2)
Qmax.pop_front();
if(i-v2>=0)
MaxC[i-v2+1][j]=MaxL[Qmax.front()][j];
while(!Qmin.empty()&&MinL[Qmin.back()][j]>MinL[i][j])
Qmin.pop_back();
Qmin.push_back(i);
if(Qmin.front()<=i-v2)
Qmin.pop_front();
if(i-v2>=0)
MinC[i-v2+1][j]=MinL[Qmin.front()][j];
}
}
for(int i=1;i<=N-v2+1;i++)
for(int j=1;j<=M-v1+1;j++)
if(Min>MaxC[i][j]-MinC[i][j])
Min=MaxC[i][j]-MinC[i][j],cnt=1;
else if(Min==MaxC[i][j]-MinC[i][j])
cnt++;
}
int main()
{
freopen("struti.in","r",stdin);
freopen("struti.out","w",stdout);
scanf("%d%d%d",&N,&M,&P);
for(int i=1;i<=N;i++)
for(int j=1;j<=M;j++)
scanf("%d",&v[i][j]);
for(int step=1;step<=P;step++)
{
scanf("%d%d",&X1,&X2);
Min=INF,cnt=0;
Solve(X1,X2);
if(X1!=X2) Solve(X2,X1);
printf("%d %d\n",Min,cnt);
}
return 0;
}