Pagini recente » Cod sursa (job #2660557) | Cod sursa (job #2246425) | Cod sursa (job #38304) | Cod sursa (job #3249613) | Cod sursa (job #334319)
Cod sursa(job #334319)
#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][NMAX],dlmax[NMAX][NMAX],dcmin[NMAX][NMAX],dcmax[NMAX][NMAX];
int plmin[NMAX],ulmin[NMAX],plmax[NMAX],ulmax[NMAX],pcmin[NMAX],ucmin[NMAX],pcmax[NMAX],ucmax[NMAX];
void oferta(int x,int y) {
int dif;
for(i=0;i<m;i++) {
plmin[i]=plmax[i]=1;
ulmin[i]=ulmax[i]=0;
}
for(i=0;i<n;i++) {
pcmin[i]=pcmax[i]=1;
ucmin[i]=ucmax[i]=0;
}
for(i=0;i<m;i++)
for(j=0;j<n;j++) {
// lmin
while((ulmin[i]>=plmin[i])&&(a[i][dlmin[i][ulmin[i]]]>=a[i][j])) ulmin[i]--;
dlmin[i][++ulmin[i]]=j;
if(j-dlmin[i][plmin[i]]+1>x) plmin[i]++;
pmin[i][j]=dlmin[i][plmin[i]];
// lmax
while((ulmax[i]>=plmax[i])&&(a[i][dlmax[i][ulmax[i]]]<=a[i][j])) ulmax[i]--;
dlmax[i][++ulmax[i]]=j;
if(j-dlmax[i][plmax[i]]+1>x) plmax[i]++;
pmax[i][j]=dlmax[i][plmax[i]];
// cmin
while((ucmin[j]>=pcmin[j])&&(a[dcmin[j][ucmin[j]]][pmin[dcmin[j][ucmin[j]]][j]]>=a[i][pmin[i][j]]))
ucmin[j]--;
dcmin[j][++ucmin[j]]=i;
if(i-dcmin[j][pcmin[j]]+1>y) pcmin[j]++;
// cmax
while((ucmax[j]>=pcmax[j])&&(a[dcmax[j][ucmax[j]]][pmax[dcmax[j][ucmax[j]]][j]]<=a[i][pmax[i][j]]))
ucmax[j]--;
dcmax[j][++ucmax[j]]=i;
if(i-dcmax[j][pcmax[j]]+1>y) pcmax[j]++;
if((i>=y-1)&&(j>=x-1)) {
dif=a[dcmax[j][pcmax[j]]][pmax[dcmax[j][pcmax[j]]][j]]-a[dcmin[j][pcmin[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);
}
}