Pagini recente » Cod sursa (job #113969) | Cod sursa (job #2481421) | Cod sursa (job #809508) | Cod sursa (job #81497) | Cod sursa (job #240198)
Cod sursa(job #240198)
#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;
}