Pagini recente » Cod sursa (job #2778323) | Cod sursa (job #746180) | Cod sursa (job #2249055) | Cod sursa (job #2831515) | Cod sursa (job #1045682)
#include<stdio.h>
FILE *fin=fopen("struti.in","r"),
*fout=fopen("struti.out","w");
int n,m,a[1005][1005],min[1005][1005],max[1005][1005],maxf[1005][1005],minf[1005][1005],P;
int dif,nr;
int deq[1005];
void rezolvare(int x,int y)
{
for(int k=1;k<=n;k++)
{
int li=1,lf=0;
for(int i=1;i<y;i++){
while(lf>=li && a[k][deq[lf]]<=a[k][i])
--lf;
deq[++lf]=i;
}
for(int i=y;i<=m;i++)
{
if(deq[li] < i-y+1)
++li;
while(lf>=li && a[k][deq[lf]]<=a[k][i])
--lf;
deq[++lf]=i;
max[k][i-y+1]=a[k][deq[li]];
}
}
for(int k=1;k<=m-y+1;k++)
{
int li=1,lf=0;
for(int i=1;i<x;i++)
{
while(lf>=li && max[deq[lf]][k]<=max[i][k])
--lf;
deq[++lf]=i;
}
for(int i=x;i<=n;i++)
{
if(deq[li]<i-x+1)
++li;
while(lf>=li && max[deq[lf]][k]<=max[i][k])
--lf;
deq[++lf]=i;
maxf[i-x+1][k]=max[deq[li]][k];
}
}
for(int k=1;k<=n;k++)
{
int li=1,lf=0;
for(int i=1;i<y;i++)
{
while(lf>=li && a[k][deq[lf]]>=a[k][i])
--lf;
deq[++lf]=i;
}
for(int i=y;i<=m;i++)
{
if(deq[li] < i-y+1)
++li;
while(lf>=li && a[k][deq[lf]]>=a[k][i])
--lf;
deq[++lf]=i;
min[k][i-y+1]=a[k][deq[li]];
}
}
for(int k=1;k<=m-y+1;k++)
{
int li=1,lf=0;
for(int i=1;i<x;i++){
while(lf>=li && min[deq[lf]][k]>=min[i][k])
--lf;
deq[++lf]=i;
}
for(int i=x;i<=n;i++)
{
if(deq[li]<i-x+1)
++li;
while(lf>=li && min[deq[lf]][k]>=min[i][k])
--lf;
deq[++lf]=i;
minf[i-x+1][k]=min[deq[li]][k];
}
}
int nn=n-x+1,mm=m-y+1;
for(int i=1;i<=nn;i++)
for(int j=1;j<=mm;j++)
if(maxf[i][j]-minf[i][j]<dif)
{
dif=maxf[i][j]-minf[i][j];
nr=1;
}
else
if(maxf[i][j]-minf[i][j]==dif)
++nr;
}
int main(){
fscanf(fin,"%d%d%d",&n,&m,&P);
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
fscanf(fin,"%d",&a[i][j]);
for(int k=1;k<=P;k++)
{
int i,j;
fscanf(fin,"%d %d",&i,&j);
dif=80010;
rezolvare(i,j);
if(i!=j)
rezolvare(j,i);
fprintf(fout,"%d %d\n",dif,nr);
}
fclose(fin);
fclose(fout);
return 0;
}