Pagini recente » Cod sursa (job #2142953) | Cod sursa (job #2431063) | Cod sursa (job #97419) | Cod sursa (job #3295730) | Cod sursa (job #494997)
Cod sursa(job #494997)
#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 dmax_st,dmax_sf,dmin_st,dmin_sf,n,m,p,dx,dy,a[MaxN][MaxN],sol,nrsol,mat[MaxN][MaxN],matmin[MaxN][MaxN],matmax[MaxN][MaxN];
s dmax[MaxN],dmin[MaxN];
inline void add(int x, int pos)
{
while(dmin_st<=dmin_sf)
{
if(dmin[dmin_sf].x<x)
{
break;
}
--dmin_sf;
}
dmin[++dmin_sf].x=x;
dmin[dmin_sf].pos=pos;
while(dmax_st<=dmax_sf)
{
if(dmax[dmax_sf].x>x)
{
break;
}
--dmax_sf;
}
dmax[++dmax_sf].x=x;
dmax[dmax_sf].pos=pos;
}
inline void del(int pos)
{
while(dmin_st<=dmin_sf)
{
if(dmin[dmin_st].pos>=pos)
{
break;
}
++dmin_st;
}
while(dmax_st<=dmax_sf)
{
if(dmax[dmax_st].pos>=pos)
{
break;
}
++dmax_st;
}
}
inline void solve()
{
for(register int i=1;i<=n;++i)
{
dmax_st=0;
dmax_sf=-1;
dmin_st=0;
dmin_sf=-1;
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[dmax_st].x;
matmin[i][j-dy+1]=dmin[dmin_st].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_st=0;
dmax_sf=-1;
dmin_st=0;
dmin_sf=-1;
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[dmax_st].x-dmin[dmin_st].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;
}