Pagini recente » Cod sursa (job #575803) | Cod sursa (job #3002658) | Cod sursa (job #517274) | Cod sursa (job #2192678) | Cod sursa (job #512795)
Cod sursa(job #512795)
#include <cstdio>
using namespace std;
int const mn=1000,minval=0,maxval=8000;
int a[mn][mn],imin[mn],imax[mn],minv[mn][mn],maxv[mn][mn],M,N,P,di,dj,opt,cnt;
void solve()
{ int i,j,emin,fmin,emax,fmax,val;
for(i=0;N>i;++i)
{ emin=0;fmin=-1;
emax=0;fmax=-1;
for(j=0;M>j;++j)
{ while((fmax>=emax)&&(a[i][imax[fmax]]<=a[i][j])){--fmax;} imax[++fmax]=j;
while(imax[emax]<=j-dj){++emax;} maxv[i][j] =a[i][imax[emax]];
while((fmin>=emin)&&(a[i][imin[fmin]]>=a[i][j])){--fmin;} imin[++fmin]=j;
while(imin[emin]<=j-dj){++emin;} minv[i][j] =a[i][imin[emin]];
}
}
for(j=dj-1;M>j;++j)
{ emin=0;fmin=-1;
emax=0;fmax=-1;
for(i=0;N>i;++i)
{ while((fmax>=emax)&&(maxv[imax[fmax]][j]<=maxv[i][j])){--fmax;} imax[++fmax]=i;
while(imax[emax]<=i-di){++emax;}
while((fmin>=emin)&&(minv[imin[fmin]][j]>=minv[i][j])){--fmin;} imin[++fmin]=i;
while(imin[emin]<=i-di){++emin;}
if(di-1<=i)
{ val =maxv[imax[emax]][j]-minv[imin[emin]][j];
if(val<opt){opt=val;cnt=1;}
else{if(opt==val){++cnt;}}
}
}
}
}
int main()
{ freopen("struti.in","r",stdin);
freopen("struti.out","w",stdout);
int i,j;
scanf("%d %d %d",&M,&N,&P);
for(j=0;M>j;++j)
{ for(i=0;N>i;++i)
{scanf("%d",&a[i][j]);}
}
for(i=0;P>i;++i)
{ scanf("%d %d",&di,&dj);
opt=(maxval-minval+1);cnt=0;
solve();
if(di!=dj)
{ j=di;di=dj;dj=j;
solve();
}
printf("%d %d\n",opt,cnt);
}
return 0;
}