Pagini recente » Cod sursa (job #83927) | Cod sursa (job #1760781) | Cod sursa (job #973726) | Cod sursa (job #2156324) | Cod sursa (job #2484060)
#include <bits/stdc++.h>
#define maxim 1003
using namespace std;
int deq[maxim],deqM[maxim];
int n,p,m,DX,DY;
int ans,nr;
int mat[maxim][maxim],mmin[maxim][maxim],mmax[maxim][maxim];
int ansmin[maxim][maxim],ansmax[maxim][maxim];
void deqlinii(int a, int b)
{
int f1,f2,l1,l2;
for (int i=1;i<=n; ++i )
{ f1=f2=1;
l1=l2=0;
for (int j=1;j<=m;++j)
{
while (l1 >=f1 && mat[i][j] < mat[i][deq[l1]] )
l1--;
deq[++l1]=j;
if (j-deq[f1] >= b)
f1++;
mmin[i][j]=mat[i][deq[f1]];
while (l2 >= f2 && mat[i][j]> mat[i][deqM[l2]])
l2--;
deqM[++l2]=j;
if (j-deqM[f2] >= b)
f2++;
mmax[i][j]=mat[i][deqM[f2]];
}
}
}
void deqcoloane(int a, int b)
{
int f1,f2,l1,l2;
for (int j=b;j<=m;++j)
{
f1=f2=1;
l1=l2=0;
for (int i = 1; i <= n; ++i)
{
while (l1 >= f1 && mmin[i][j] < mmin[deq[l1]][j])
l1--;
deq[++l1]=i;
if (i - deq[f1] >= a)
f1++;
ansmin[i][j] = mmin[deq[f1]][j];
while (l2 >= f2 && mmax[i][j] > mmax[deqM[l2]][j] )
l2--;
deqM[++l2]=i;
if (i-deqM[f2] >= a)
f2++;
ansmax[i][j]=mmax[deqM[f2]][j];
}
for (int i=a; i<=n ;i++ )
if (ansmax[i][j]-ansmin[i][j] < ans)
{
ans=ansmax[i][j]-ansmin[i][j];
nr=1;
}
else if (ansmax[i][j]-ansmin[i][j] == ans)
nr++;
}
}
void solve(int a , int b)
{
deqlinii(a,b);
deqcoloane(a,b);
}
int main()
{
freopen("struti.in","r",stdin);
freopen("struti.out","w",stdout);
scanf("%d %d %d",&m,&n,&p);
for (int i=1;i<=n;++i)
for (int j=1;j<=m;++j)
scanf("%d",&mat[i][j]);
while (p--)
{
scanf("%d %d",&DX,&DY);
ans=8001;
nr=0;
solve(DX,DY);
if (DX!=DY)
solve(DY,DX);
printf("%d %d\n",ans,nr);
}
}