Pagini recente » Cod sursa (job #1187879) | Cod sursa (job #153054) | Cod sursa (job #2555239) | Cod sursa (job #1241549) | Cod sursa (job #1753550)
#include <iostream>
#include <fstream>
#include <deque>
using namespace std;
ifstream in("struti.in");
ofstream out("struti.out");
deque<int> DQmin,DQmax;
int MMIN[1002][1002],MMAX[1002][1002];
int a[1002][1002];
int n,m;
int sol,nrsol;
void genssm(int DX,int DY)
{
for(int i=1; i<=n; i++)
{
DQmin.clear();
DQmax.clear();
for(int j=1; j<=m; j++)
{
while(DQmin.empty()==0 && DQmin.front()<=j-DY)
DQmin.pop_front();
while(DQmin.empty()==0 && a[i][DQmin.back()]>=a[i][j])
DQmin.pop_back();
DQmin.push_back(j);
if(j>=DY)
MMIN[i][j]=a[i][DQmin.front()];
while(DQmax.empty()==0 && DQmax.front()<=j-DY)
DQmax.pop_front();
while(DQmax.empty()==0 && a[i][DQmax.back()]<=a[i][j])
DQmax.pop_back();
DQmax.push_back(j);
if(j>=DY)
MMAX[i][j]=a[i][DQmax.front()];
}
}
}
void ssmcol(int DX,int DY)
{
for(int j=DY; j<=m; j++)
{
DQmin.clear();
DQmax.clear();
for(int i=1; i<=n; i++)
{
while(DQmin.empty()==0 && DQmin.front()<=i-DX)
DQmin.pop_front();
while(DQmin.empty()==0 && MMIN[DQmin.back()][j]>=MMIN[i][j])
DQmin.pop_back();
DQmin.push_back(i);
while(DQmax.empty()==0 && DQmax.front()<=i-DX)
DQmax.pop_front();
while(DQmax.empty()==0 && MMAX[DQmax.back()][j]<=MMAX[i][j])
DQmax.pop_back();
DQmax.push_back(i);
if(i>=DX && j>=DY)
{
int dif=MMAX[DQmax.front()][j]-MMIN[DQmin.front()][j];
cout<<dif<<" ";
if(sol>dif)
{
sol=dif;
nrsol=1;
}
else if(sol==dif)
{
nrsol++;
}
}
}
}
}
void solve(int DX,int DY)
{
genssm(DX,DY);
ssmcol(DX,DY);
}
int main()
{
int p;
in>>n>>m>>p;
for(int i=1; i<=n; i++)
{
for(int j=1; j<=m; j++)
{
in>>a[i][j];
}
}
for(int i=1; i<=p; i++)
{
int DX,DY;
in>>DX>>DY;
sol=999999;
solve(DX,DY);
cout<<'\n';
if(DX!=DY)
solve(DY,DX);
out<<sol<<" "<<nrsol<<'\n';
}
}