Pagini recente » Profil roxanastrimbu07 | Istoria paginii utilizator/christi | Profil M@2Te4i | Statistici dsa dsa (test123723) | Cod sursa (job #341792)
Cod sursa(job #341792)
#include<cstdio>
#define N 1001
short int n,m,a[N][N];
short int x,y,num,rez;
struct struti{short int min,max;}d[N][N],p[N],u[N],d2[N],p1,u1;
void dq1(int i,short int q,short int y,short int x)
{
for (int j=d[i][u[i].min-1].min; j<=q+y-1; ++j)
{
short int g=j-d[i][p[i].min].min;
if (g==y) ++p[i].min;
while (p[i].min!=u[i].min&&a[i][j]<=a[i][d[i][u[i].min-1].min])
--u[i].min;
d[i][u[i].min++].min=j;
}
for (int j=d[i][u[i].max-1].max; j<=q+y-1; ++j)
{
int g=j-d[i][p[i].max].max;
if (g==y) ++p[i].max;
while (p[i].max!=u[i].max&&a[i][j]>=a[i][d[i][u[i].max-1].max])
--u[i].max;
d[i][u[i].max++].max=j;
}
}
void dq2(short int j,short int x,short int n)
{
p1.min=p1.max=u1.min=u1.max=0;
for (int i=1; i<=x; ++i)
{
int um=d2[u1.min-1].min;
while (p1.min!=u1.min&&a[i][d[i][p[i].min].min]<=a[um][d[um][p[um].min].min])
{
--u1.min;
if (p1.min!=u1.min)
um=d2[u1.min-1].min;
}
d2[u1.min++].min=i;
um=d2[u1.max-1].max;
while (p1.max!=u1.max&&a[i][d[i][p[i].max].max]>=a[um][d[um][p[um].max].max])
{
--u1.max;
if (p1.max!=u1.max)
um=d2[u1.max-1].max;
}
d2[u1.max++].max=i;
}
int i1=d2[p1.max].max,i2=d2[p1.min].min;
if(rez>a[i1][d[i1][p[i1].max].max]-a[i2][d[i2][p[i2].min].min])
{
rez=a[i1][d[i1][p[i1].max].max]-a[i2][d[i2][p[i2].min].min];
num=1;
}
else
if(rez==a[i1][d[i1][p[i1].max].max]-a[i2][d[i2][p[i2].min].min])
++num;
for (int i=x+1; i<=n; ++i)
{
int g=i-d2[p1.min].min;
if (g==x) ++p1.min;
int um=d2[u1.min-1].min;
while (p1.min!=u1.min&&a[i][d[i][p[i].min].min]<=a[um][d[um][p[um].min].min])
{
--u1.min;
if (p1.min!=u1.min)
um=d2[u1.min-1].min;
}
d2[u1.min++].min=i;
g=i-d2[p1.max].max;
if (g==x) ++p1.max;
um=d2[u1.max-1].max;
while (p1.max!=u1.max&&a[i][d[i][p[i].max].max]>=a[um][d[um][p[um].max].max])
{
--u1.max;
if (p1.max!=u1.max)
um=d2[u1.max-1].max;
}
d2[u1.max++].max=i;
i1=d2[p1.max].max;
i2=d2[p1.min].min;
if(rez>a[i1][d[i1][p[i1].max].max]-a[i2][d[i2][p[i2].min].min])
{
rez=a[i1][d[i1][p[i1].max].max]-a[i2][d[i2][p[i2].min].min];
num=1;
}
else
if(rez==a[i1][d[i1][p[i1].max].max]-a[i2][d[i2][p[i2].min].min])
++num;
}
}
void curat()
{
for (int i=1; i<=n; ++i)
{
int h;
if (u[i].max>u[i].min) h=u[i].max; else h=u[i].min;
for (int j=0; j<=h; ++j)
d[i][j].min=d[i][j].max=0;
u[i].max=u[i].min=p[i].max=p[i].min=0;
}
}
inline void matrice()
{
u[0].min=u[0].max=p[0].min=p[0].max=0;
for (int j=1; j<=m-y+1; ++j)
{
for (int i=1; i<=n; ++i)
dq1(i,j,y,x);
dq2(j,x,n);
}
curat();
if (x!=y)
{
for (int i=1; i<=n-x+1; ++i)
{
for (int j=1; j<=m; ++j)
dq1(j,i,x,y);
dq2(i,y,m);
}
curat();
}
}
void citire()
{
freopen("struti.in","r",stdin);
freopen("struti.out","w",stdout);
short int t;
scanf("%hd%hd%hd",&n,&m,&t);
for (int i=1; i<=n; ++i)
for (int j=1; j<=m; ++j)
scanf("%hd",&a[i][j]);
while(t)
{
scanf("%hd%hd",&x,&y);
num=0;
rez=8001;
matrice();
printf("%d %d\n",rez,num);
--t;
}
}
int main()
{
citire();
return 0;
}