Pagini recente » Cod sursa (job #2738437) | Cod sursa (job #283175) | Cod sursa (job #151173) | Cod sursa (job #1954972) | Cod sursa (job #358269)
Cod sursa(job #358269)
#include<stdio.h>
int x,y,m,n,xz;
long deque[1010],v[1010][1010],v1[1010][1010],v2[1010][1010],v3[1010][1010],v4[1010][1010];
int main()
{
int i,j,p,u;
long min,nr;
freopen("struti.in","r",stdin);
freopen("struti.out","w",stdout);
scanf("%d%d%d",&m,&n,&xz);
for (i=1;i<=m;++i)
for (j=1;j<=n;++j)
scanf("%ld",&v[i][j]);
while(xz--)
{
min=10000;
nr=0;
scanf("%d%d",&x,&y);
for (j=1;j<=n;++j)
{
u=0;p=1;
for (i=1;i<=m;++i)
{
while(p<=u && v[i][j]<v[deque[u]][j])
u--;
deque[++u]=i;
while(deque[p]<=i-y)
p++;
v1[i][j]=v[deque[p]][j];
}
}
for (j=1;j<=n;++j)
{
u=0;p=1;
for (i=1;i<=m;++i)
{
while(p<=u && v[i][j]>v[deque[u]][j])
u--;
deque[++u]=i;
while(deque[p]<=i-y)
p++;
v2[i][j]=v[deque[p]][j];
}
}
for (i=1;i<=m;++i)
{
u=0;p=1;
for (j=1;j<=n;++j)
{
while(p<=u && v1[i][j]<v1[i][deque[u]])
u--;
deque[++u]=j;
while(deque[p]<=j-x)
p++;
v3[i][j]=v1[i][deque[p]];
}
}
for (i=1;i<=m;++i)
{
u=0;p=1;
for (j=1;j<=n;++j)
{
while(p<=u && v2[i][j]>v2[i][deque[u]])
u--;
deque[++u]=j;
while(deque[p]<=j-x)
p++;
v4[i][j]=v2[i][deque[p]];
}
}
for (i=y;i<=m;++i)
for (j=x;j<=n;++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;
}
if (x!=y)
{
for (j=1;j<=n;++j)
{
u=0;p=1;
for (i=1;i<=m;++i)
{
while(p<=u && v[i][j]<v[deque[u]][j])
u--;
deque[++u]=i;
while(deque[p]<=i-x)
p++;
v1[i][j]=v[deque[p]][j];
}
}
for (j=1;j<=n;++j)
{
u=0;p=1;
for (i=1;i<=m;++i)
{
while(p<=u && v[i][j]>v[deque[u]][j])
u--;
deque[++u]=i;
while(deque[p]<=i-x)
p++;
v2[i][j]=v[deque[p]][j];
}
}
for (i=1;i<=m;++i)
{
u=0;p=1;
for (j=1;j<=n;++j)
{
while(p<=u && v1[i][j]<v1[i][deque[u]])
u--;
deque[++u]=j;
while(deque[p]<=j-y)
p++;
v3[i][j]=v1[i][deque[p]];
}
}
for (i=1;i<=m;++i)
{
u=0;p=1;
for (j=1;j<=n;++j)
{
while(p<=u && v2[i][j]>v2[i][deque[u]])
u--;
deque[++u]=j;
while(deque[p]<=j-y)
p++;
v4[i][j]=v2[i][deque[p]];
}
}
for (i=x;i<=m;++i)
for (j=y;j<=n;++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;
}
}
printf("%ld %ld\n",min,nr);
}
return 0;
}