Pagini recente » Cod sursa (job #1347030) | Cod sursa (job #2464558) | Cod sursa (job #1431891) | Cod sursa (job #3265044) | Cod sursa (job #358159)
Cod sursa(job #358159)
#include<stdio.h>
int n,m,min,nr;
short int v[1<<10][1<<10],v1[1<<10][1<<10],v2[1<<10][1<<10],deq[1<<10],deq2[1<<10];
void rez(int dx, int dy)
{
int p=1,u=0,i,j,p2=1,u2=0,a,b;
for(i=1;i<=n;i++)
{
p=1;u=0;
for(j=1;j<=m;j++)
{
while(p<=u && v[i][j]<v[i][deq[u]])
u--;
deq[++u]=j;
if(deq[p]+dx<=j)
p++;
v1[i][j]=v[i][deq[p]];
}
p=1;u=0;
for(j=1;j<=m;j++)
{
while(p<=u && v[i][j]>v[i][deq[u]])
u--;
deq[++u]=j;
if(deq[p]+dx<=j)
p++;
v2[i][j]=v[i][deq[p]];
}
}
for(i=dx;i<=m;i++)
{
p=1;u=0;
p2=1;u2=0;
for(j=1;j<dy;j++)
{
while(p<=u && v1[i][j]<v1[j][deq[u]])
u--;
deq[++u]=i;
if(deq[p]+dy<=i)
p++;
while(p2<=u2 && v2[i][j]>v2[j][deq2[u2]])
u2--;
deq2[++u2]=i;
if(deq2[p2]+dy<=i)
p2++;
}
for(j=dy;j<=n;j++)
{
while(p<=u && v1[i][j]<v1[j][deq[u]])
u--;
deq[++u]=i;
if(deq[p]+dy<=i)
p++;
while(p2<=u2 && v2[i][j]>v2[j][deq[u]])
u2--;
deq2[++u2]=i;
if(deq2[p2]+dy<=i)
p2++;
a=v1[deq[p]][j];b=v2[deq2[p2]][j];
if(b-a<min)
min=b-a,nr=1;
else
if(b-a==min)
nr++;
}
}
}
int main()
{
freopen("struti.in","r",stdin);
freopen("struti.out","w",stdout);
int k,dx,dy;
short int x;
char s[6000];
scanf("%d%d%d\n",&n,&m,&k);
int i,j,y;
for(i=1;i<=n;i++)
{
gets(s+1);
y=0;
for(j=1;s[j];j++)
if(s[j]==' ')
{
v[i][++y]=x;
x=0;
}
else
x=x*10+s[j]-'0';
v[i][++y]=x;
x=0;
}
while(k--)
{
scanf("%d%d",&dx,&dy);
min=1<<30;nr=0;
rez(dx,dy);
if(dx-dy)
rez(dy,dx);
printf("%d %d\n",min,nr);
}
return 0;
}