Pagini recente » Cod sursa (job #2282600) | Cod sursa (job #2448434) | Cod sursa (job #1654734) | Cod sursa (job #258040) | Cod sursa (job #1563166)
#include <cstdio>
#include <cstdlib>
#define MAXN 1000
#define INF 1000000000
int mat[MAXN][MAXN],poz[2][MAXN],de[2][MAXN][MAXN];
//0 max
//1 min
int main(){
FILE*fi,*fout;
int i,j,n,m,bmin,bmax,emax,emin,l,c,q,min,con;
fi=fopen("struti.in" ,"r");
fout=fopen("struti.out" ,"w");
fscanf(fi,"%d%d%d" ,&n,&m,&q);
for(i=0;i<n;i++)
for(j=0;j<m;j++)
fscanf(fi,"%d" ,&mat[i][j]);
while(q>0){
q--;
fscanf(fi,"%d%d" ,&l,&c);
for(i=0;i<n;i++){
poz[0][0]=poz[1][0]=-1;
bmin=bmax=0;
emin=emax=-1;
for(j=0;j<m;j++){
if(j-poz[0][bmax]+1>c)
bmax++;
if(j-poz[1][bmin]+1>c)
bmin++;
while(emax>=bmax&&mat[i][poz[0][emax]]<=mat[i][j])
emax--;
while(emin>=bmin&&mat[i][poz[1][emin]]>=mat[i][j])
emin--;
poz[0][++emax]=j;
poz[1][++emin]=j;
if(j>=c-1){
de[0][i][j-c+1]=mat[i][poz[0][bmax]];
de[1][i][j-c+1]=mat[i][poz[1][bmin]];
}
}
}
min=INF;
for(i=0;i<=m-c;i++){
poz[0][0]=poz[1][0]=-1;
emax=emin=-1;
bmax=bmin=0;
for(j=0;j<n;j++){
if(j-poz[0][bmax]+1>l)
bmax++;
if(j-poz[1][bmin]+1>l)
bmin++;
while(emax>=bmax&&de[0][poz[0][emax]][i]<=de[0][j][i])
emax--;
while(emin>=bmin&&de[1][poz[1][emin]][i]>=de[1][j][i])
emin--;
poz[0][++emax]=j;
poz[1][++emin]=j;
if(j>=l-1){
if(de[0][poz[0][bmax]][i]-de[1][poz[1][bmin]][i]<min){
min=de[0][poz[0][bmax]][i]-de[1][poz[1][bmin]][i];
con=1;
}
else
if(de[0][poz[0][bmax]][i]-de[1][poz[1][bmin]][i]==min)
con++;
}
}
}
if(l!=c){
int aux=l;
l=c;
c=aux;
for(i=0;i<n;i++){
poz[0][0]=poz[1][0]=-1;
bmin=bmax=0;
emin=emax=-1;
for(j=0;j<m;j++){
if(j-poz[0][bmax]+1>c)
bmax++;
if(j-poz[1][bmin]+1>c)
bmin++;
while(emax>=bmax&&mat[i][poz[0][emax]]<=mat[i][j])
emax--;
while(emin>=bmin&&mat[i][poz[1][emin]]>=mat[i][j])
emin--;
poz[0][++emax]=j;
poz[1][++emin]=j;
if(j>=c-1){
de[0][i][j-c+1]=mat[i][poz[0][bmax]];
de[1][i][j-c+1]=mat[i][poz[1][bmin]];
}
}
}
for(i=0;i<=m-c;i++){
poz[0][0]=poz[1][0]=-1;
emax=emin=-1;
bmax=bmin=0;
for(j=0;j<n;j++){
if(j-poz[0][bmax]+1>l)
bmax++;
if(j-poz[1][bmin]+1>l)
bmin++;
while(emax>=bmax&&de[0][poz[0][emax]][i]<=de[0][j][i])
emax--;
while(emin>=bmin&&de[1][poz[1][emin]][i]>=de[1][j][i])
emin--;
poz[0][++emax]=j;
poz[1][++emin]=j;
if(j>=l-1)
if(de[0][poz[0][bmax]][i]-de[1][poz[1][bmin]][i]<min){
min=de[0][poz[0][bmax]][i]-de[1][poz[1][bmin]][i];
con=1;
}
else
if(de[0][poz[0][bmax]][i]-de[1][poz[1][bmin]][i]==min)
con++;
}
}
}
fprintf(fout,"%d %d\n" ,min,con);
}
fclose(fi);
fclose(fout);
return 0;
}