Pagini recente » Cod sursa (job #899462) | Cod sursa (job #77529) | Cod sursa (job #3197119) | Cod sursa (job #957499) | Cod sursa (job #494990)
Cod sursa(job #494990)
#include <fstream>
#include <deque>
//#define DEBUG
using namespace std;
const char InFile[]="struti.in";
const char OutFile[]="struti.out";
const int MaxN=1005;
const int MAX=1<<30;
ifstream fin(InFile);
ofstream fout(OutFile);
struct s
{
s(int x2=0,int pos2=0):x(x2),pos(pos2){}
int x,pos;
};
int n,m,p,dx,dy,a[MaxN][MaxN],sol,nrsol,mat[MaxN][MaxN],matmin[MaxN][MaxN],matmax[MaxN][MaxN];
deque<s> dmax,dmin;
inline void add(int x, int pos)
{
while(!dmin.empty())
{
if(dmin.back().x<x)
{
break;
}
dmin.pop_back();
}
dmin.push_back(s(x,pos));
while(!dmax.empty())
{
if(dmax.back().x>x)
{
break;
}
dmax.pop_back();
}
dmax.push_back(s(x,pos));
}
inline void del(int pos)
{
while(!dmin.empty())
{
if(dmin.front().pos>=pos)
{
break;
}
dmin.pop_front();
}
while(!dmax.empty())
{
if(dmax.front().pos>=pos)
{
break;
}
dmax.pop_front();
}
}
void solve()
{
for(register int i=1;i<=n;++i)
{
dmax.clear();
dmin.clear();
for(register int j=1;j<=m;++j)
{
add(a[i][j],j);
if(j-dy+1>0)
{
del(j-dy+1);
matmax[i][j-dy+1]=dmax.front().x;
matmin[i][j-dy+1]=dmin.front().x;
}
}
}
#ifdef DEBUG
for(register int i=1;i<=n;++i)
{
for(register int j=1;j<=m-dy+1;++j)
{
fout<<matmax[i][j]<<" ";
}
fout<<"\n";
}
fout<<"\n";
for(register int i=1;i<=n;++i)
{
for(register int j=1;j<=m-dy+1;++j)
{
fout<<matmin[i][j]<<" ";
}
fout<<"\n";
}
fout<<"\n";
#endif
for(register int j=1;j<=m-dy+1;++j)
{
dmax.clear();
dmin.clear();
for(register int i=1;i<=n;++i)
{
add(matmin[i][j],i);
add(matmax[i][j],i);
if(i-dx+1>0)
{
del(i-dx+1);
mat[i-dx+1][j]=dmax.front().x-dmin.front().x;
}
}
}
#ifdef DEBUG
for(register int i=1;i<=n-dx+1;++i)
{
for(register int j=1;j<=m-dy+1;++j)
{
fout<<mat[i][j]<<" ";
}
fout<<"\n";
}
fout<<"\n\n\n";
#endif
for(register int i=1;i<=n-dx+1;++i)
{
for(register int j=1;j<=m-dy+1;++j)
{
if(sol>mat[i][j])
{
sol=mat[i][j];
nrsol=1;
}
else if(sol==mat[i][j])
{
++nrsol;
}
}
}
}
int main()
{
fin>>n>>m>>p;
for(register int i=1;i<=n;++i)
{
for(register int j=1;j<=m;++j)
{
fin>>a[i][j];
}
}
for(register int i=0;i<p;++i)
{
fin>>dx>>dy;
sol=MAX;
nrsol=0;
solve();
if(dx!=dy)
{
swap(dx,dy);
solve();
}
fout<<sol<<" "<<nrsol<<"\n";
}
fout.close();
fin.close();
return 0;
}