Pagini recente » Cod sursa (job #1440122) | Cod sursa (job #1869252) | Cod sursa (job #2441287) | Cod sursa (job #802111) | Cod sursa (job #334394)
Cod sursa(job #334394)
#include<stdio.h>
#define NMAX 1003
int i,j,m,n,p,dx,dy,difmin,nter;
int *a,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,u,minp,maxp;
int *ai,*aij;
for(i=0;i<n;i++) {
pcmin[i]=pcmax[i]=1;
ucmin[i]=ucmax[i]=0;
}
for(i=0;i<m;i++) {
ai=a+i*NMAX;
aij=a+i*NMAX;
plmin=plmax=1;
ulmin=ulmax=0;
for(j=0;j<n;j++) {
// lmin
while((ulmin>=plmin)&&(*(ai+dlmin[ulmin])>=*aij)) ulmin--;
dlmin[++ulmin]=j;
if(j-dlmin[plmin]+1>x) plmin++;
minp=pmin[i][j]=*(a+i*NMAX+dlmin[plmin]);
// lmax
while((ulmax>=plmax)&&(*(ai+dlmax[ulmax])<=*aij)) ulmax--;
dlmax[++ulmax]=j;
if(j-dlmax[plmax]+1>x) plmax++;
maxp=pmax[i][j]=*(ai+dlmax[plmax]);
if(j>=x-1) {
// 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) {
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++;
}
}
aij++;
}
}
}
int main() {
a=new int[NMAX*NMAX];
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*NMAX+j)=0;
while((s[id]>='0')&&(s[id]<='9')) *(a+i*NMAX+j)=*(a+i*NMAX+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);
}
}