Pagini recente » Cod sursa (job #792158) | Cod sursa (job #155780) | Cod sursa (job #2474983) | Cod sursa (job #2903945) | Cod sursa (job #1738360)
#include<bits/stdc++.h>
using namespace std;
deque<int> q,q1;
int minim=10000,n,m,p,a[1005][1005],m1[1005][1005],m2[1005][1005],x=0,y=0,nr,dx,dy;
void solve(int l,int L)
{
for(int i=1;i<=n;i++)
{
while (!q.empty()) q.pop_front();
for(int j=1;j<=m;j++)
{
while (!q.empty() && a[i][q.back()]>=a[i][j])
{
q.pop_back();
}
q.push_back(j);
while (q.front()<=(j-L)) q.pop_front();
if (j>=L)
{
m1[i][j]=q.front();
}
}
while (!q.empty()) q.pop_front();
for(int j=1;j<=m;j++)
{
while (!q.empty() && a[i][q.back()]<=a[i][j])
{
q.pop_back();
}
q.push_back(j);
while (q.front()<=(j-L)) q.pop_front();
if (j>=L)
{
m2[i][j]=q.front();
}
}
}
for(int j=L;j<=m;j++)
{
while (!q.empty()) q.pop_front();
while (!q1.empty()) q1.pop_front();
for(int i=1;i<=n;i++)
{
while (!q.empty() && a[q.back()][m1[q.back()][j]]>=a[i][m1[i][j]])
{
q.pop_back();
}
q.push_back(i);
if (q.front()<=(i-l)) q.pop_front();
if (i>=l) x=a[q.front()][m1[q.front()][j]];
//
while (!q1.empty() && a[q1.back()][m2[q1.back()][j]]<=a[i][m2[i][j]])
{
q1.pop_back();
}
q1.push_back(i);
if (q1.front()<=(i-l)) q1.pop_front();
if (i>=l) y=a[q1.front()][m2[q1.front()][j]];
//
if (i>=l)
{
if ((y-x)<minim) minim=y-x,nr=1;
else
if((y-x)==minim) nr++;
}
}
}
}
int main()
{
freopen("struti.in","r",stdin);
freopen("struti.out","w",stdout);
scanf("%d%d%d",&n,&m,&p);
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
scanf("%d",&a[i][j]);
}
}
for(int t=1;t<=p;t++)
{
minim=10000;
nr=0;
scanf("%d%d",&dx,&dy);
solve(dx,dy);
if (dx!=dy) solve(dy,dx);
printf("%d %d\n",minim,nr);
}
return 0;
}