Pagini recente » Cod sursa (job #512781) | Cod sursa (job #197077) | Cod sursa (job #2239207) | Borderou de evaluare (job #2012051) | Cod sursa (job #206132)
Cod sursa(job #206132)
#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 dq[1005];
void rezolvare(int x,int y){
//matrice max linii
for(int k=1;k<=N;k++){
int li=1,lf=0;
for(int i=1;i<y;i++){
while(lf>=li && a[k][dq[lf]]<=a[k][i])
--lf;
dq[++lf]=i;
}
for(int i=y;i<=M;i++){
if(dq[li] < i-y+1)
++li;
while(lf>=li && a[k][dq[lf]]<=a[k][i])
--lf;
dq[++lf]=i;
max[k][i-y+1]=a[k][dq[li]];
}
}
//pe coloane
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[dq[lf]][k]<=max[i][k])
--lf;
dq[++lf]=i;
}
for(int i=x;i<=N;i++){
if(dq[li]<i-x+1)
++li;
while(lf>=li && max[dq[lf]][k]<=max[i][k])
--lf;
dq[++lf]=i;
maxf[i-x+1][k]=max[dq[li]][k];
}
}
//matricea minima
for(int k=1;k<=N;k++){
int li=1,lf=0;
for(int i=1;i<y;i++){
while(lf>=li && a[k][dq[lf]]>=a[k][i])
--lf;
dq[++lf]=i;
}
for(int i=y;i<=M;i++){
if(dq[li] < i-y+1)
++li;
while(lf>=li && a[k][dq[lf]]>=a[k][i])
--lf;
dq[++lf]=i;
min[k][i-y+1]=a[k][dq[li]];
}
}
//pe coloane
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[dq[lf]][k]>=min[i][k])
--lf;
dq[++lf]=i;
}
for(int i=x;i<=N;i++){
if(dq[li]<i-x+1)
++li;
while(lf>=li && min[dq[lf]][k]>=min[i][k])
--lf;
dq[++lf]=i;
minf[i-x+1][k]=min[dq[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++)
fprintf(fout,"%d ",max[i][j]);
fprintf(fout,"\n");
}
fprintf(fout,"\n");
for(int i=1;i<=NN;i++){
for(int j=1;j<=MM;j++)
fprintf(fout,"%d ",maxf[i][j]);
fprintf(fout,"%\n");
}
*/
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;
}