Pagini recente » Cod sursa (job #2960499) | Cod sursa (job #49748) | Cod sursa (job #1208961) | Cod sursa (job #1478140) | Cod sursa (job #1058892)
#include<cstdio>
#include<algorithm>
#include<deque>
#include<cstring>
#define oo 100523
using namespace std;
int i,n,m,j,A[1010][1010],MAX[1010][1010],MIN[1010][1010],SOL[1010][1010],sol[1010][1010],val,poz,t,x,y,iul,nriul;
void rezolva();
deque<pair<int,int> >Q;
int main()
{
freopen("struti.in","r",stdin);
freopen("struti.out","w",stdout);
scanf("%d%d%d",&n,&m,&t);
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
scanf("%d",&A[i][j]);
for(;t;--t)
{
scanf("%d%d",&x,&y);
/*memset(SOL,0,sizeof(SOL));
memset(MAX,0,sizeof(SOL));
memset(sol,0,sizeof(SOL));
memset(MIN,0,sizeof(SOL));*/
rezolva();
iul=oo;nriul=0;
for(i=y;i<=n;i++)
for(j=x;j<=m;j++)
{
if(iul>SOL[i][j]-sol[i][j])
{
iul=SOL[i][j]-sol[i][j];
nriul=1;
continue;
}
if(iul==SOL[i][j]-sol[i][j])++nriul;
}
if(x!=y){
swap(x,y);
rezolva();
for(i=y;i<=n;i++)
for(j=x;j<=m;j++)
{
if(iul>SOL[i][j]-sol[i][j]){iul=SOL[i][j]-sol[i][j];nriul=1;continue;}
if(iul==SOL[i][j]-sol[i][j])++nriul;
}
}
printf("%d %d\n",iul,nriul);
}
return 0;
}
void rezolva()
{
for(i=1;i<=n;i++)
{
for(j=1;j<=m;j++)
{
for(;!Q.empty();)
{
val=Q.back().first;
if(val<=A[i][j]){Q.pop_back();continue;}
break;
}
Q.push_back(make_pair(A[i][j],j));
for(;!Q.empty();)
{
poz=Q.front().second;
if(poz<j-x+1){Q.pop_front();continue;}
break;
}
MAX[i][j]=Q.front().first;
}
Q.resize(0);
}
for(j=x;j<=m;j++)
{
for(i=1;i<=n;i++)
{
for(;!Q.empty();)
{
val=Q.back().first;
if(val<=MAX[i][j]){Q.pop_back();continue;}
break;
}
Q.push_back(make_pair(MAX[i][j],i));
for(;!Q.empty();)
{
poz=Q.front().second;
if(poz<i-y+1){Q.pop_front();continue;}
break;
}
if(i>=y)SOL[i][j]=Q.front().first;
}
Q.resize(0);
}
for(i=1;i<=n;i++)
{
for(j=1;j<=m;j++)
{
for(;!Q.empty();)
{
val=Q.back().first;
if(val>=A[i][j]){Q.pop_back();continue;}
break;
}
Q.push_back(make_pair(A[i][j],j));
for(;!Q.empty();)
{
poz=Q.front().second;
if(poz<j-x+1){Q.pop_front();continue;}
break;
}
MIN[i][j]=Q.front().first;
}
Q.resize(0);
}
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
for(j=x;j<=m;j++)
{
for(i=1;i<=n;i++)
{
for(;!Q.empty();)
{
val=Q.back().first;
if(val>=MIN[i][j]){Q.pop_back();continue;}
break;
}
Q.push_back(make_pair(MIN[i][j],i));
for(;!Q.empty();)
{
poz=Q.front().second;
if(poz<i-y+1){Q.pop_front();continue;}
break;
}
if(i>=y)sol[i][j]=Q.front().first;
}
Q.resize(0);
}
}