Pagini recente » Cod sursa (job #182216) | Cod sursa (job #147733) | Cod sursa (job #143666) | Cod sursa (job #1031347) | Cod sursa (job #1338110)
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<deque>
#define Nmax 1005
using namespace std;
int n,m,nr,t,dx,dy,sol;
int a[Nmax][Nmax],e[Nmax][Nmax],d[Nmax][Nmax];
void citire()
{
int i,j;
for (i=1;i<=n;i++)
for (j=1;j<=m;j++)
scanf("%d",&a[i][j]);
}
void solve (int dx,int dy)
{
int i,j,p,q;
deque < int >dc,ec,dl,el;
dc.clear(); dl.clear();
ec.clear(); el.clear();
for (i=1;i<=n;++i)
{
dc.clear(); ec.clear();
for (j=1;j<=m;j++)
{
while (!dc.empty() && a[i][dc.back()]>a[i][j])
dc.pop_back();
dc.push_back(j);
if (j-dc.front()==dx) dc.pop_front();
d[i][j]=dc.front();
while (!ec.empty() && a[i][ec.back()]<a[i][j])
ec.pop_back();
ec.push_back(j);
if (j-ec.front()==dx) ec.pop_front();
e[i][j]=ec.front();
}
}
dl.clear(); el.clear();
for (j=1;j<=m;j++)
{
dl.clear(); el.clear();
for (i=1;i<=n;i++)
{
while (!dl.empty() && a[dl.back()][d[dl.back()][j]]>a[i][d[i][j]])
dl.pop_back();
dl.push_back(i);
if (i-dl.front()==dy) dl.pop_front();
while (!el.empty() && a[el.back()][e[el.back()][j]]<=a[i][e[i][j]])
el.pop_back();
el.push_back(i);
if (i-el.front()==dy) el.pop_front();
if (i>=dy && j>=dx)
{
p=a[el.front()][e[el.front()][j]];
q=a[dl.front()][d[dl.front()][j]];
if (p-q<sol)
sol=p-q,nr=1; else
if (p-q==sol)
++nr;
}
}
}
}
int main()
{
freopen("struti.in","r",stdin);
freopen("struti.out","w",stdout);
scanf("%d %d %d",&n,&m,&t); t++;
citire();
while (--t)
{
scanf("%d %d",&dx,&dy); sol=2000000000;
solve(dx,dy);
if (dy!=dx) solve(dy,dx);
printf("%d %d\n",sol,nr);
}
return 0;
}