Pagini recente » Cod sursa (job #39994) | Cod sursa (job #1459540) | Cod sursa (job #2966203) | Cod sursa (job #2379981) | Cod sursa (job #779120)
Cod sursa(job #779120)
#include <stdio.h>
#define DIM 1002
#define MAX 10000
int a[DIM][DIM];
int b[DIM][DIM];
int b1[DIM][DIM];
int dq[DIM][DIM];
int dq1[DIM][DIM];
int eq[DIM][DIM];
int eq1[DIM][DIM];
int rmin[DIM][DIM];
int rmax[DIM][DIM];
int X,Y,P,dx,dy,i,j,k,p,p1,u,u1,min,nr,aux;
int main()
{
FILE *f = fopen("struti.in","r");
FILE *g = fopen("struti.out","w");
fscanf(f,"%d%d%d",&X,&Y,&P);
for (i=1; i<=X; i++)
for (j=1; j<=Y; j++)
fscanf(f,"%d",&a[i][j]);
for (k=1; k<=P; k++)
{
fscanf(f,"%d %d",&dx,&dy);
for (j=1; j<=Y; j++)
{
dq[1][j] = 1;
p=1;
u=1;
for (i=2; i<=X; i++)
{
while(p<=u && a[dq[u][j]][j]>a[i][j])
u--;
dq[++u][j] = i;
if (i>=dx)
b[i][j] = a[dq[p][j]][j];
if (i-dx+1 == dq[p][j])
p++;
}
dq1[1][j]=1;
p1=1;
u1=1;
for (i=2; i<=X; i++)
{
while(p1<=u1 && a[dq1[u1][j]][j]<a[i][j])
u1--;
dq1[++u1][j] = i;
if (i>=dx)
b1[i][j] = a[dq1[p1][j]][j];
if (i-dx+1 == dq1[p1][j])
p1++;
}
}
for (i=dx; i<=X; i++)
{
eq[i][1] = 1;
p=1;
u=1;
for (j=2; j<=Y; j++)
{
while (p<=u && b[i][j]<b[i][eq[i][u]])
u--;
eq[i][++u] = j;
if (j>=dy)
rmin[i][j] = b[i][eq[i][p]];
if (j-dy+1 == eq[i][p])
p++;
}
eq1[i][1] = 1;
p1=1;
u1=1;
for (j=2; j<=Y; j++)
{
while (p1<=u1 && b1[i][j]>b1[i][eq1[i][u1]])
u1--;
eq1[i][++u1] = j;
if (j>=dy)
rmax[i][j] = b1[i][eq1[i][p1]];
if (j-dy+1 == eq1[i][p1])
p1++;
}
}
min = MAX;
nr = 0;
for (i=dx; i<=X; i++)
for (j=dy; j<=Y; j++)
if (rmax[i][j]-rmin[i][j]<min)
{
min = rmax[i][j]-rmin[i][j];
nr = 1;
}
else if (rmax[i][j]-rmin[i][j]==min)
nr++;
if (dx!=dy)
{
aux = dx;
dx = dy;
dy = aux;
for (j=1; j<=Y; j++)
{
dq[1][j] = 1;
p=1;
u=1;
for (i=2; i<=X; i++)
{
while(p<=u && a[dq[u][j]][j]>a[i][j])
u--;
dq[++u][j] = i;
if (i>=dx)
b[i][j] = a[dq[p][j]][j];
if (i-dx+1 == dq[p][j])
p++;
}
dq1[1][j]=1;
p1=1;
u1=1;
for (i=2; i<=X; i++)
{
while(p1<=u1 && a[dq1[u1][j]][j]<a[i][j])
u1--;
dq1[++u1][j] = i;
if (i>=dx)
b1[i][j] = a[dq1[p1][j]][j];
if (i-dx+1 == dq1[p1][j])
p1++;
}
}
for (i=dx; i<=X; i++)
{
eq[i][1] = 1;
p=1;
u=1;
for (j=2; j<=Y; j++)
{
while (p<=u && b[i][j]<b[i][eq[i][u]])
u--;
eq[i][++u] = j;
if (j>=dy)
rmin[i][j] = b[i][eq[i][p]];
if (j-dy+1 == eq[i][p])
p++;
}
eq1[i][1] = 1;
p1=1;
u1=1;
for (j=2; j<=Y; j++)
{
while (p1<=u1 && b1[i][j]>b1[i][eq1[i][u1]])
u1--;
eq1[i][++u1] = j;
if (j>=dy)
rmax[i][j] = b1[i][eq1[i][p1]];
if (j-dy+1 == eq1[i][p1])
p1++;
}
}
for (i=dx; i<=X; i++)
for (j=dy; j<=Y; j++)
if (rmax[i][j]-rmin[i][j]<min)
{
min = rmax[i][j]-rmin[i][j];
nr = 1;
}
else if (rmax[i][j]-rmin[i][j]==min)
nr++;
}
fprintf(g,"%d %d\n",min,nr);
}
fclose(f);
fclose(g);
return 0;