Pagini recente » Cod sursa (job #2215891) | Cod sursa (job #182625) | Cod sursa (job #1595795) | Cod sursa (job #2188192) | Cod sursa (job #358147)
Cod sursa(job #358147)
#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],v3[1<<10][1<<10],v4[1<<10][1<<10],deq1[1<<10],deq2[1<<10];
void rez(int dx, int dy)
{
int p1=1,u1=0,i,j,p2=1,u2=0;
for(i=1;i<=n;i++)
{
p1=1;u1=0;
p2=1;u2=0;
for(j=1;j<=m;j++)
{
while(p1<=u1 && v[i][j]<v[i][deq1[u1]])
u1--;
deq1[++u1]=j;
if(deq1[p1]+dx<=j)
p1++;
v1[i][j]=v[i][deq1[p1]];
while(p2<=u2 && v[i][j]>v[i][deq2[u2]])
u2--;
deq2[++u2]=j;
if(deq2[p2]+dx<=j)
p2++;
v2[i][j]=v[i][deq2[p2]];
}
}
for(j=dx;j<=m;j++)
{
p1=1;u1=0;
p2=1;u2=0;
for(i=1;i<=n;i++)
{
while(p1<=u1 && v1[i][j]<v1[deq1[u1]][j])
u1--;
deq1[++u1]=i;
if(deq1[p1]+dy<=i)
p1++;
v3[i][j]=v1[deq1[p1]][j];
while(p2<=u2 && v2[i][j]>v2[deq2[u2]][j])
u2--;
deq2[++u2]=i;
if(deq2[p2]+dy<=i)
p2++;
v4[i][j]=v2[deq2[p2]][j];
}
}
for(i=dy;i<=n;i++)
for(j=dx;j<=m;j++)
if(v4[i][j]-v3[i][j]<min)
{
min=v4[i][j]-v3[i][j];
nr=1;
}
else
if(v4[i][j]-v3[i][j]==min)
nr++;
}
void rez2(int dx, int dy)
{
rez(dx,dy);
if(dx!=dy)
{
int i,j;
for(i=1;i<=m;++i)
for(j=1;j<=n;++j)
v1[i][j]=v[j][m-i+1];
for(i=1;i<=m;i++)
for(j=1;j<=n;j++)
v[i][j]=v1[i][j];
i=n;n=m;m=i;
rez(dy,dx);
for(i=1;i<=m;++i)
for(j=1;j<=n;++j)
v1[i][j]=v[j][m-i+1];
for(i=1;i<=m;i++)
for(j=1;j<=n;j++)
v[i][j]=v1[i][j];
i=n;n=m;m=i;
}
}
int main()
{
freopen("struti.in","r",stdin);
freopen("struti.out","w",stdout);
int k,dx,dy;
scanf("%d%d%d",&n,&m,&k);
int i,j;
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
scanf("%hd",&v[i][j]);
while(k--)
{
scanf("%d%d",&dx,&dy);
min=1<<13;nr=0;
rez2(dx,dy);
printf("%d %d\n",min,nr);
}
return 0;
}