Pagini recente » Cod sursa (job #913636) | Cod sursa (job #1687987) | Cod sursa (job #2491514) | Cod sursa (job #2190946) | Cod sursa (job #63742)
Cod sursa(job #63742)
#include <stdio.h>
#define fin "struti.in"
#define fout "struti.out"
#define Nmax 1001
#define INFI 8001
int N,M,X,Y,P,best,cnt,map[Nmax][Nmax];
int dq1[Nmax][Nmax][2],dql1[Nmax][2],p1[Nmax][2]; //min 0 - prim 1 - varf
int dq2[Nmax][Nmax][2],dql2[Nmax][2],p2[Nmax][2]; //max
int pr1,vf1,pr2,vf2;
void go(int X,int Y) {
int i,j,min,max,dif;
for (i=1;i<=M;++i) {
p1[i][0]=p1[i][1]=1; dq1[i][1][0]=INFI; dq1[i][1][1]=0;
p2[i][0]=p2[i][1]=1; dq2[i][1][0]=-1; dq2[i][1][1]=0;
}
for (i=1;i<=N;++i)
for (j=1;j<=M;++j) {
if ( j==1 ) {
pr1=vf1=1; dql1[1][0]=INFI; dql1[1][1]=0;
pr2=vf2=1; dql2[1][0]=-1; dql2[1][1]=0;
}
if (dq1[j][p1[j][0]][1]<=i-Y)
++p1[j][0];
if (dq2[j][p2[j][0]][1]<=i-Y)
++p2[j][0];
if (dql1[pr1][1]<=j-X)
++pr1;
if (dql2[pr2][1]<=j-X)
++pr2;
while ( map[i][j] < dq1[j][p1[j][1]][0] && p1[j][1] >= p1[j][0] )
--p1[j][1];
++p1[j][1];
dq1[j][p1[j][1]][0]=map[i][j]; dq1[j][p1[j][1]][1]=i;
while ( map[i][j] > dq2[j][p2[j][1]][0] && p2[j][1] >= p2[j][0] )
--p2[j][1];
++p2[j][1];
dq2[j][p2[j][1]][0]=map[i][j]; dq2[j][p2[j][1]][1]=i;
min=dq1[j][p1[j][0]][0]; //imi iau minimul de pe coloana j
max=dq2[j][p2[j][0]][0]; //si maximul
while ( min < dql1[vf1][0] && vf1 >= pr1 )
--vf1;
++vf1;
dql1[vf1][0]=min; dql1[vf1][1]=j;
while ( max > dql2[pr2][0] && vf2 >= pr2 )
--vf2;
++vf2;
dql2[vf2][0]=max; dql2[vf2][1]=j;
dif=dql2[pr2][0]-dql1[pr1][0];
if (j>=X && i>=Y) {
if ( dif < best ) {
best=dif;
cnt=0;
}
if (dif==best)
++cnt;
}
}
}
int main() {
int i,j;
freopen(fin,"r",stdin); freopen(fout,"w",stdout);
scanf("%d%d%d",&N,&M,&P);
for (i=1;i<=N;++i)
for (j=1;j<=M;++j)
scanf("%d",&map[i][j]);
for (;P>0;--P) {
scanf("%d%d",&X,&Y);
best=INFI; cnt=0;
go(X,Y);
if (X!=Y) go(Y,X);
printf("%d %d\n",best,cnt);
}
return 0;
}