Pagini recente » Cod sursa (job #2678454) | Cod sursa (job #139188) | Cod sursa (job #2430758) | Borderou de evaluare (job #665890) | Cod sursa (job #349578)
Cod sursa(job #349578)
#include <stdio.h>
#define DIM 1005
#define INF 8005
int a[DIM][DIM],min[DIM][DIM],max[DIM][DIM];
int dq_min[DIM][2],dq_max[DIM][2];
int n,m,q,nrt,nrm,st1,dr1,st2,dr2;
void read ()
{
int i,j;
scanf ("%d%d%d",&n,&m,&q);
for (i=1; i<=n; ++i)
for (j=1; j<=m; ++j)
scanf ("%d",&a[i][j]);
}
void init (int tip)
{
int i,j;
for (i=1; i<=n; ++i)
for (j=1; j<=m; ++j)
min[i][j]=max[i][j]=a[i][j];
if (!tip)
{
nrt=INF;
nrm=0;
}
}
void solve (int x,int y)
{
int i,j,mini,maxi;
for (j=1; j<=m; ++j)
{
st1=st2=1;
dr1=dr2=0;
for (i=1; i<=n; ++i)
{
for ( ; st1<=dr1 && min[i][j]<=dq_min[dr1][0]; --dr1);
dq_min[++dr1][0]=min[i][j];
dq_min[dr1][1]=i;
for ( ; st2<=dr2 && max[i][j]>=dq_max[dr2][0]; --dr2);
dq_max[++dr2][0]=max[i][j];
dq_max[dr2][1]=i;
if (dq_min[st1][1]==i-y)
++st1;
if (dq_max[st2][1]==i-y)
++st2;
min[i][j]=dq_min[st1][0];
max[i][j]=dq_max[st2][0];
}
}
for (i=y; i<=n; ++i)
{
st1=st2=1;
dr1=dr2=0;
for (j=1; j<=m; ++j)
{
for ( ; st1<=dr1 && min[i][j]<=dq_min[dr1][0]; --dr1);
dq_min[++dr1][0]=min[i][j];
dq_min[dr1][1]=j;
for ( ; st2<=dr2 && max[i][j]>=dq_max[dr2][0]; --dr2);
dq_max[++dr2][0]=max[i][j];
dq_max[dr2][1]=j;
if (dq_min[st1][1]==j-x)
++st1;
if (dq_max[st2][1]==j-x)
++st2;
mini=dq_min[st1][0];
maxi=dq_max[st2][0];
if (j>=x && (maxi-mini)<nrt)
{
nrt=maxi-mini;
nrm=1;
}
else if (j>=x && maxi-mini==nrt)
++nrm;
}
}
}
void query ()
{
int i,x,y;
for (i=1; i<=q; ++i)
{
scanf ("%d%d",&x,&y);
init (0);
solve (x,y);
if (x!=y)
{
init (1);
solve (y,x);
}
printf ("%d %d\n",nrt,nrm);
}
}
int main ()
{
freopen ("struti.in","r",stdin);
freopen ("struti.out","w",stdout);
read ();
query ();
return 0;
}