Pagini recente » Cod sursa (job #867377) | Cod sursa (job #2929921) | Cod sursa (job #970998) | Cod sursa (job #1320254) | Cod sursa (job #2417167)
#include <fstream>
#include <deque>
#include <algorithm>
const int NMAX=1005;
using namespace std;
ifstream cin ("struti.in");
ofstream cout ("struti.out");
short int a[NMAX][NMAX];
short int minim1[NMAX][NMAX],maxim1[NMAX][NMAX],minim2[NMAX][NMAX],maxim2[NMAX][NMAX];
int m,n;
pair <int,int> solve(int dx,int dy)
{
for(int i=1; i<=m; ++i)
{
deque <int> qmin;
deque <int> qmax;
for(int j=1; j<=n; ++j)
{
while(!qmin.empty() && a[i][qmin.back()]>=a[i][j])
qmin.pop_back();
qmin.push_back(j);
if(qmin.front()<=j-dx)
qmin.pop_front();
minim1[i][j]=a[i][qmin.front()];
while(!qmax.empty() && a[i][qmax.back()]<=a[i][j])
qmax.pop_back();
qmax.push_back(j);
if(qmax.front()<=j-dx)
qmax.pop_front();
maxim1[i][j]=a[i][qmax.front()];
}
}
for(int j=1; j<=n; ++j)
{
deque <int> qmin;
deque <int> qmax;
for(int i=1; i<=m; ++i)
{
while(!qmin.empty() && minim1[qmin.back()][j]>=minim1[i][j])
qmin.pop_back();
qmin.push_back(i);
if(qmin.front()<=i-dy)
qmin.pop_front();
minim2[i][j]=minim1[qmin.front()][j];
while(!qmax.empty() && maxim1[qmax.back()][j]<=maxim1[i][j])
qmax.pop_back();
qmax.push_back(i);
if(qmax.front()<=i-dy)
qmax.pop_front();
maxim2[i][j]=maxim1[qmax.front()][j];
}
}
int dif=1e6,cnt=0;
for(int i=dy; i<=m; ++i)
for(int j=dx; j<=n; ++j){
if(maxim2[i][j]-minim2[i][j]<dif)
{
dif=maxim2[i][j]-minim2[i][j];
cnt=1;
}
else
if(maxim2[i][j]-minim2[i][j]==dif)
cnt++;
}
for(int i=1; i<=m; ++i)
for(int j=1; j<=n; ++j)
minim1[i][j]=maxim1[i][j]=minim2[i][j]=maxim2[i][j]=0;
return {dif,cnt};
}
int main()
{
int p;
cin>>m>>n>>p;
for(int i=1; i<=m; ++i)
for(int j=1; j<=n; ++j)
cin>>a[i][j];
for(int q=1; q<=p; ++q)
{
int dx,dy;
cin>>dx>>dy;
pair <int,int> a=solve(dx,dy);
pair <int,int> b=solve(dy,dx);
if(dx==dy){
cout<<a.first<<" "<<a.second<<'\n';
continue;
}
if(a.first<b.first)
cout<<a.first<<" "<<a.second<<'\n';
else
if(a.first==b.first)
cout<<a.first<<" "<<a.second+b.second<<'\n';
else
cout<<b.first<<" "<<b.second<<'\n';
}
return 0;
}