Pagini recente » Cod sursa (job #3239943) | Cod sursa (job #2573423) | Cod sursa (job #2737636) | Cod sursa (job #2333588) | Cod sursa (job #2268695)
#include <iostream>
#include <cstdio>
#include <deque>
using namespace std;
int a[1005][1005], mx[1005][1005], mn[1005][1005], mxx[1005][1005], mnn[1005][1005];
int n,m,p,x,y;
int nr, s;
void cauta(int l, int c)
{
deque <int> qmin;
deque <int> qmax;
for(int i=1; i<=m; ++i)
{
qmin.clear();
qmax.clear();
for(int j=1; j<=n; ++j)
{
while(!qmin.empty() && a[i][qmin.back()]>a[i][j])
qmin.pop_back();
while(!qmax.empty() && a[i][qmax.back()]<a[i][j])
qmax.pop_back();
qmin.push_back(j);
qmax.push_back(j);
if(j>=c)
mn[i][j] = a[i][qmin.front()], mx[i][j] = a[i][qmax.front()];
if(j-qmin.front()>=c)
qmin.pop_front();
if(j-qmax.front()>=c)
qmax.pop_front();
}
}
for(int j=1; j<=n; ++j)
{
qmin.clear();
qmax.clear();
for(int i=1; i<=m; ++i)
{
while(!qmin.empty() && a[qmin.back()][j]>a[i][j])
qmin.pop_back();
while(!qmax.empty() && a[qmax.back()][j]<a[i][j])
qmax.pop_back();
qmin.push_back(i);
qmax.push_back(i);
if(i>=l)
{
mnn[i][j] = a[qmin.front()][j], mxx[i][j] = a[qmax.front()][j];
if(j>=c)
{
int maxim = max(mx[i][j], mxx[i][j]);
int minim = min(mn[i][j], mnn[i][j]);
if(maxim-minim==nr)
++s;
else if(maxim-minim<nr)
{
nr=maxim-minim;
s=1;
}
}
}
if(i-qmin.front()>=l)
qmin.pop_front();
if(i-qmax.front()>=l)
qmax.pop_front();
}
}
}
int main()
{
freopen("struti.in","r",stdin);
freopen("struti.out","w",stdout);
cin>>m>>n>>p;
for(int i=1; i<=m; ++i)
for(int j=1; j<=n; ++j)
cin>>a[i][j];
for(int i=0; i<p; ++i)
{
cin>>x>>y;
nr = 100000000;
cauta(x,y);
if(x!=y)
cauta(y,x);
cout<<nr<<" "<<s<<"\n";
}
return 0;
}