Pagini recente » Cod sursa (job #1060095) | Cod sursa (job #711838) | Cod sursa (job #2365869) | Cod sursa (job #665976) | Cod sursa (job #341298)
Cod sursa(job #341298)
#include<cstdio>
#define N 1001
int a[N][N],u[N],p[N],d[N][N],u1[N],p1[N],d1[N][N],maxim,minim,num,rez,n,m;
void deque(int x,int dx,int dy)
{
maxim=minim=0;
for (int j=1; j<=dy; ++j)
{
for (int i=x; i<=x+dx; ++i)
{
while (u[i]!=p[i]&&a[i][j]<=a[i][d[i][u[i]-1]])
--u[i];
d[i][u[i]++]=j;
if (minim>a[i][d[i][p[i]]])
minim=a[i][d[i][p[i]]];
while (u1[i]!=p1[i]&&a[i][j]>=a[i][d1[i][u1[i]-1]])
--u1[i];
d1[i][u1[i]++]=j;
if (maxim<a[i][d1[i][p1[i]]])
maxim=a[i][d1[i][p1[i]]];
}
}
rez=maxim-minim;
for (int j=dy+1; j<=m; ++j)
{
for (int i=x; i<=x+dx; ++i)
{
int g=j-d[i][p[i]];
if (g==dy)
{
++p[i];
minim=0;
}
while (u[i]!=p[i]&&a[i][j]<=a[i][d[i][u[i]-1]])
--u[i];
d[i][u[i]++]=j;
if (minim>a[i][d[i][p[i]]])
minim=a[i][d[i][p[i]]];
g=j-d1[i][p1[i]];
if (g==dy)
{
++p1[i];
maxim=0;
}
while (u1[i]!=p1[i]&&a[i][j]<=a[i][d1[i][u1[i]-1]])
--u1[i];
d1[i][u1[i]++]=j;
if (maxim<a[i][d1[i][p1[i]]])
maxim=a[i][d1[i][p1[i]]];
if (rez>maxim-minim)
{
rez=maxim-minim;
num=1;
}
else
if (rez==maxim-minim)
++num;
}
}
}
void citire()
{
freopen("struti.in","r",stdin);
freopen("struti.out","w",stdout);
int l;
scanf("%d%d%d",&n,&m,&l);
for (int i=1; i<=n;++i)
for (int j=1; j<=m; ++j)
scanf("%d",&a[i][j]);
while (l)
{
--l;
int dx,dy;
num=1;
scanf("%d%d",&dx,&dy);
for (int i=1; i<=n-dx; ++i)
deque(i,dx,dy);
for (int i=1; i<=n-dy; ++i)
deque(i,dy,dx);
printf("%d %d\n",rez,num);
}
}
int main()
{
citire();
return 0;
}