Pagini recente » Cod sursa (job #1010325) | Cod sursa (job #1981268) | Cod sursa (job #1803985) | Cod sursa (job #1008187) | Cod sursa (job #334346)
Cod sursa(job #334346)
#include<stdio.h>
#define NMAX 1003
int i,j,m,n,p,dx,dy,difmin,nter;
int a[NMAX][NMAX],pmin[NMAX][NMAX],pmax[NMAX][NMAX];
int dlmin[NMAX],dlmax[NMAX],dcmin[NMAX][NMAX],dcmax[NMAX][NMAX];
int plmin,ulmin,plmax,ulmax,pcmin[NMAX],ucmin[NMAX],pcmax[NMAX],ucmax[NMAX];
void oferta(int x,int y) {
int dif,pr,aij,u,minp,maxp;
for(i=0;i<n;i++) {
pcmin[i]=pcmax[i]=1;
ucmin[i]=ucmax[i]=0;
}
for(i=0;i<m;i++) {
plmin=plmax=1;
ulmin=ulmax=0;
for(j=0;j<n;j++) {
aij=a[i][j];
// lmin
while((ulmin>=plmin)&&(a[i][dlmin[ulmin]]>=aij)) ulmin--;
dlmin[++ulmin]=j;
if(j-dlmin[plmin]+1>x) plmin++;
minp=pmin[i][j]=a[i][dlmin[plmin]];
// lmax
while((ulmax>=plmax)&&(a[i][dlmax[ulmax]]<=aij)) ulmax--;
dlmax[++ulmax]=j;
if(j-dlmax[plmax]+1>x) plmax++;
maxp=pmax[i][j]=a[i][dlmax[plmax]];
// cmin
pr=pcmin[j];
u=ucmin[j];
while((u>=pr)&&(pmin[dcmin[j][u]][j]>=minp)) u--;
dcmin[j][++u]=i;
ucmin[j]=u;
if(i-dcmin[j][pr]+1>y) pcmin[j]++;
// cmax
pr=pcmax[j];
u=ucmax[j];
while((u>=pr)&&(pmax[dcmax[j][u]][j]<=maxp)) u--;
dcmax[j][++u]=i;
ucmax[j]=u;
if(i-dcmax[j][pr]+1>y) pcmax[j]++;
if((i>=y-1)&&(j>=x-1)) {
dif=pmax[dcmax[j][pcmax[j]]][j]-pmin[dcmin[j][pcmin[j]]][j];
if(dif<difmin) {
difmin=dif;
nter=1;
}
else
if(dif==difmin) nter++;
}
}
}
}
int main() {
char s[5003];
int id;
freopen("struti.in","r",stdin);
freopen("struti.out","w",stdout);
scanf("%d %d %d\n",&m,&n,&p);
for(i=0;i<m;i++) {
fgets(s,5003,stdin);
id=0;
for(j=0;j<n;j++) {
a[i][j]=0;
while((s[id]>='0')&&(s[id]<='9')) a[i][j]=a[i][j]*10+s[id++]-'0';
id++;
}
}
for(;p--;) {
scanf("%d %d",&dx,&dy);
difmin=10000;
oferta(dx,dy);
if(dx!=dy) oferta(dy,dx);
printf("%d %d\n",difmin,nter);
}
}