Pagini recente » Cod sursa (job #2536465) | Cod sursa (job #2339683) | Cod sursa (job #905883) | Cod sursa (job #2282715) | Cod sursa (job #79633)
Cod sursa(job #79633)
#include<stdio.h>
#define Nm 1000
#define Inf 8001
int M[Nm][Nm],n,m,p;
int Minvc[Nm][Nm],Minpc[Nm][Nm],Maxvc[Nm][Nm],Maxpc[Nm][Nm];
int Lmin[Nm],Rmin[Nm],Lmax[Nm],Rmax[Nm],lmin,rmin,lmax,rmax;
int Minv[Nm],Minp[Nm],Maxv[Nm],Maxp[Nm];
void read()
{
char S[5*Nm];
int i,j,k;
freopen("struti.in","r",stdin);
scanf("%d%d%d\n",&n,&m,&p);
for(i=0;i<n;++i)
{
gets(S); k=-1;
for(j=0;j<m;++j)
for(++k;S[k]!=' ' && S[k];++k)
M[i][j]=M[i][j]*10+S[k]-'0';
}
}
int difmin,nr;
void query(int a, int b)
{
int i,j,v;
for(j=0;j<m;++j)
{
Lmin[j]=Lmax[j]=0;
Rmin[j]=Rmax[j]=-1;
}
for(i=0;i<a;++i)
for(j=0;j<m;++j)
{
v=M[i][j];
while(Lmin[j]<=Rmin[j] && v<Minvc[j][Rmin[j]])
--Rmin[j];
Minvc[j][++Rmin[j]]=v;
Minpc[j][Rmin[j]]=i;
while(Lmax[j]<=Rmax[j] && v>Maxvc[j][Rmax[j]])
--Rmax[j];
Maxvc[j][++Rmax[j]]=v;
Maxpc[j][Rmax[j]]=i;
}
for(;i<n;++i)
{
lmin=lmax=0;
rmin=rmax=-1;
for(j=0;j<b;++j)
{
v=Minvc[j][Lmin[j]];
while(lmin<=rmin && v<Minv[rmin])
--rmin;
Minv[++rmin]=v;
Minp[rmin]=j;
v=Maxvc[j][Lmax[j]];
while(lmax<=rmax && v>Maxv[rmax])
--rmax;
Maxv[++rmax]=v;
Maxp[rmax]=j;
}
for(;j<m;++j)
{
v=Maxv[lmax]-Minv[lmin];
if(v<difmin)
{
difmin=v;
nr=1;
}
else
if(v==difmin)
++nr;
v=Minvc[j][Lmin[j]];
while(lmin<=rmin && v<Minv[rmin])
--rmin;
Minv[++rmin]=v;
Minp[rmin]=j;
if(Minp[lmin]==j-b)
++lmin;
v=Maxvc[j][Lmax[j]];
while(lmax<=rmax && v>Maxv[rmax])
--rmax;
Maxv[++rmax]=v;
Maxp[rmax]=j;
if(Maxp[lmax]==j-b)
++lmax;
}
v=Maxv[lmax]-Minv[lmin];
if(v<difmin)
{
difmin=v;
nr=1;
}
else
if(v==difmin)
++nr;
for(j=0;j<m;++j)
{
v=M[i][j];
while(Lmin[j]<=Rmin[j] && v<Minvc[j][Rmin[j]])
--Rmin[j];
Minvc[j][++Rmin[j]]=v;
Minpc[j][Rmin[j]]=i;
if(Minpc[j][Lmin[j]]==i-a)
++Lmin[j];
while(Lmax[j]<=Rmax[j] && v>Maxvc[j][Rmax[j]])
--Rmax[j];
Maxvc[j][++Rmax[j]]=v;
Maxpc[j][Rmax[j]]=i;
if(Maxpc[j][Lmax[j]]==i-a)
++Lmax[j];
}
}
lmin=lmax=0;
rmin=rmax=-1;
for(j=0;j<b;++j)
{
v=Minvc[j][Lmin[j]];
while(lmin<=rmin && v<Minv[rmin])
--rmin;
Minv[++rmin]=v;
Minp[rmin]=j;
v=Maxvc[j][Lmax[j]];
while(lmax<=rmax && v>Maxv[rmax])
--rmax;
Maxv[++rmax]=v;
Maxp[rmax]=j;
}
for(;j<m;++j)
{
v=Maxv[lmax]-Minv[lmin];
if(v<difmin)
{
difmin=v;
nr=1;
}
else
if(v==difmin)
++nr;
v=Minvc[j][Lmin[j]];
while(lmin<=rmin && v<Minv[rmin])
--rmin;
Minv[++rmin]=v;
Minp[rmin]=j;
if(Minp[lmin]==j-b)
++lmin;
v=Maxvc[j][Lmax[j]];
while(lmax<=rmax && v>Maxv[rmax])
--rmax;
Maxv[++rmax]=v;
Maxp[rmax]=j;
if(Maxp[lmax]==j-b)
++lmax;
}
v=Maxv[lmax]-Minv[lmin];
if(v<difmin)
{
difmin=v;
nr=1;
}
else
if(v==difmin)
++nr;
}
void solve()
{
int a,b;
freopen("struti.out","w",stdout);
while(p--)
{
scanf("%d%d",&a,&b);
difmin=Inf;
query(a,b);
if(a!=b)
query(b,a);
printf("%d %d\n",difmin,nr);
}
}
int main()
{
read();
solve();
return 0;
}