Pagini recente » Cod sursa (job #785224) | Cod sursa (job #392077) | Cod sursa (job #498024) | Cod sursa (job #2148212) | Cod sursa (job #623052)
Cod sursa(job #623052)
#include <stdio.h>
#define nmax 1005
struct element{long nr, poz;};
long n, m, p, i, j, r, inc, sf, ii, nl, nc, aux, rez, nrez;
long ma[nmax][nmax], min[nmax][nmax], max[nmax][nmax], maxr[nmax][nmax], minr[nmax][nmax];
element co[nmax*nmax];
void citire()
{
scanf("%ld %ld %ld",&n, &m, &p);
for (i=1;i<=n;i++)
for (j=1;j<=m;j++)
scanf("%ld",&ma[i][j]);
}
bool rel(long a, long b)
{
if (r==1)
return (a>=b);
return (a<=b);
}
void pecoloane()
{
for (r=1;r<=2;r++)
for (j=1;j<=m;j++)
{
co[1].nr=ma[1][j]; co[1].poz=1;
inc=1; sf=1;
for (i=2;i<=n;i++)
{
if (co[inc].poz==i-nl)
inc++;
while ((rel(co[sf].nr,ma[i][j])) && (sf>=inc))
sf--;
co[++sf].nr=ma[i][j]; co[sf].poz=i;
if (r==1)
min[i][j]=co[inc].nr;
else
max[i][j]=co[inc].nr;
}
}
}
void rezolvare()
{
for (r=1;r<=2;r++)
for (i=nl;i<=n;i++)
{
if (r==1)
co[1].nr=min[i][1];
else
co[1].nr=max[i][1];
inc=1; sf=1; co[1].poz=1;
for (j=2;j<=m;j++)
{
if (co[inc].poz==j-nc)
inc++;
if (r==1)
{
while ((co[sf].nr>=min[i][j]) && (sf>=inc))
sf--;
co[++sf].nr=min[i][j]; co[sf].poz=j;
minr[i][j]=co[inc].nr;
}
else
{
while ((co[sf].nr<=max[i][j]) && (sf>=inc))
sf--;
co[++sf].nr=max[i][j]; co[sf].poz=j;
maxr[i][j]=co[inc].nr;
}
}
}
for (i=nl;i<=n;i++)
for (j=nc;j<=m;j++)
{
if (maxr[i][j]-minr[i][j]<rez)
{ rez=maxr[i][j]-minr[i][j]; nrez=0; }
if (maxr[i][j]-minr[i][j]==rez)
nrez++;
}
}
int main()
{
freopen("struti.in","r",stdin);
freopen("struti.out","w",stdout);
citire();
for (ii=1;ii<=p;ii++)
{
scanf("%ld %ld",&nl,&nc);
rez=8100; nrez=0;
pecoloane(); rezolvare();
if (nl!=nc)
{
aux=nl; nl=nc; nc=aux;
pecoloane(); rezolvare();
}
printf("%ld %ld\n",rez,nrez);
}
return 0;
}