Pagini recente » Cod sursa (job #2056664) | Cod sursa (job #2941776) | Cod sursa (job #2387693) | Cod sursa (job #1391846) | Cod sursa (job #79564)
Cod sursa(job #79564)
using namespace std;
#include<cstdio>
#define Nm 1000
#define Inf 8001
int M[Nm][Nm],n,m,p;
int Minc[Nm][Nm],Maxc[Nm][Nm],Lminc[Nm],Lmaxc[Nm],Rminc[Nm],Rmaxc[Nm];
int Min[Nm],Max[Nm],lmin,lmax,rmin,rmax;
void read()
{
int i,j;
freopen("struti.in","r",stdin);
scanf("%d%d%d",&n,&m,&p);
for(i=0;i<n;++i)
for(j=0;j<m;++j)
scanf("%d",&M[i][j]);
}
int difmin,nr;
void query(int a, int b)
{
int i,j,dif;
for(j=0;j<m;++j)
{
Lminc[j]=Lmaxc[j]=0;
Rminc[j]=Rmaxc[j]=-1;
}
for(i=0;i<n;++i)
{
lmin=lmax=0;
rmin=rmax=-1;
for(j=0;j<m;++j)
{
while(Lminc[j]<=Rminc[j] && M[i][j]<M[Minc[j][Rminc[j]]][j])
--Rminc[j];
Minc[j][++Rminc[j]]=i;
while(Lmaxc[j]<=Rmaxc[j] && M[i][j]>M[Maxc[j][Rmaxc[j]]][j])
--Rmaxc[j];
Maxc[j][++Rmaxc[j]]=i;
if(i>=a-1)
{
if(Minc[j][Lminc[j]]==i-a)
++Lminc[j];
if(Maxc[j][Lmaxc[j]]==i-a)
++Lmaxc[j];
while(lmin<=rmin && M[Minc[j][Lminc[j]]][j]<M[Minc[Min[rmin]][Lminc[Min[rmin]]]][Min[rmin]])
--rmin;
Min[++rmin]=j;
while(lmax<=rmax && M[Maxc[j][Lmaxc[j]]][j]>M[Maxc[Max[rmax]][Lmaxc[Max[rmax]]]][Max[rmax]])
--rmax;
Max[++rmax]=j;
if(j>=b-1)
{
if(Min[lmin]==j-b)
++lmin;
if(Max[lmax]==j-b)
++lmax;
dif=M[Maxc[Max[lmax]][Lmaxc[Max[lmax]]]][Max[lmax]]-M[Minc[Min[lmin]][Lminc[Min[lmin]]]][Min[lmin]];
if(dif==difmin)
++nr;
else
if(dif<difmin)
{
difmin=dif;
nr=1;
}
}
}
}
}
}
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;
}