Pagini recente » Cod sursa (job #308239) | Cod sursa (job #1997593) | Cod sursa (job #1009993) | Cod sursa (job #1338945) | Cod sursa (job #1598632)
#include <bits/stdc++.h>
#define INF 1000000000
#define Nmax 1005
using namespace std;
int a[Nmax][Nmax],n,m;
int LMaxx[Nmax][Nmax],LMinn[Nmax][Nmax],sol,cnt;
deque <int> Q1,Q2;
inline void Solve(int DX, int DY)
{
int i,j;
for(i=1;i<=n;++i)
{
Q1.clear(); Q2.clear();
for(j=1;j<=m;++j)
{
while(!Q1.empty() && Q1.front()<=j-DY) Q1.pop_front();
while(!Q2.empty() && Q2.front()<=j-DY) Q2.pop_front();
while(!Q1.empty() && a[i][Q1.back()]<a[i][j]) Q1.pop_back();
Q1.push_back(j);
while(!Q2.empty() && a[i][Q2.back()]>a[i][j]) Q2.pop_back();
Q2.push_back(j);
if(j>=DY) LMaxx[i][j]=a[i][Q1.front()];
if(j>=DY) LMinn[i][j]=a[i][Q2.front()];
}
}
for(j=DY;j<=m;++j)
{
Q1.clear(); Q2.clear();
for(i=1;i<=n;++i)
{
while(!Q1.empty() && Q1.front()<=i-DX) Q1.pop_front();
while(!Q2.empty() && Q2.front()<=i-DX) Q2.pop_front();
while(!Q1.empty() && LMaxx[Q1.back()][j]<LMaxx[i][j]) Q1.pop_back();
Q1.push_back(i);
while(!Q2.empty() && LMinn[Q2.back()][j]>LMinn[i][j]) Q2.pop_back();
Q2.push_back(i);
if(i>=DX)
{
int val=LMaxx[Q1.front()][j]-LMinn[Q2.front()][j];
if(sol>val)
{
sol=val; cnt=1;
}
else
if(sol==val) ++cnt;
}
}
}
}
int main()
{
int Q,Dx,Dy,i,j;
ifstream cin("struti.in");
ofstream cout("struti.out");
cin>>n>>m>>Q;
for(i=1;i<=n;++i)
for(j=1;j<=m;++j) cin>>a[i][j];
while(Q--)
{
cin>>Dx>>Dy;
sol=INF;
Solve(Dx,Dy);
if(Dx!=Dy) Solve(Dy,Dx);
cout<<sol<<" "<<cnt<<"\n";
}
return 0;
}