Pagini recente » Cod sursa (job #1688065) | Cod sursa (job #1184603) | Cod sursa (job #2081548) | Cod sursa (job #1864875) | Cod sursa (job #478552)
Cod sursa(job #478552)
#include<fstream>
using namespace std;
const char iname[]="struti.in";
const char oname[]="struti.out";
const int maxn=1005;
ifstream f(iname);
ofstream g(oname);
int a[maxn][maxn],mint[maxn][maxn],maxt[maxn][maxn],dx,dy,i,j,n,m,k,dmin[maxn],dmax[maxn],pmin,qmin,pmax,qmax,rez,many;
void calc(int dx,int dy)
{
for(i=1;i<=n;++i)
{
pmin=pmax=1;
qmin=qmax=0;
for(j=1;j<=m;++j)
{
while(qmin>=pmin&&a[i][dmin[qmin]]>=a[i][j])
--qmin;
dmin[++qmin]=j;
while(dmin[pmin]<=j-dy)
++pmin;
mint[i][j]=a[i][dmin[pmin]];
while(qmax>=pmax&&a[i][dmax[qmax]]<=a[i][j])
--qmax;
dmax[++qmax]=j;
while(dmax[pmax]<=j-dy)
++pmax;
maxt[i][j]=a[i][dmax[pmax]];
}
}
for(j=dy;j<=m;++j)
{
pmin=pmax=1;
qmin=qmax=0;
for(i=1;i<=n;++i)
{
while(qmin>=pmin&&mint[dmin[qmin]][j]>=mint[i][j])
--qmin;
dmin[++qmin]=i;
while(dmin[pmin]<=i-dx)
++pmin;
while(qmax>=pmax&&maxt[dmax[qmax]][j]<=maxt[i][j])
--qmax;
dmax[++qmax]=i;
while(dmax[pmax]<=i-dx)
++pmax;
if(i<dx)
continue;
if(maxt[dmax[pmax]][j]-mint[dmin[pmin]][j]<rez)
rez=maxt[dmax[pmax]][j]-mint[dmin[pmin]][j],many=1;
else
if(maxt[dmax[pmax]][j]-mint[dmin[pmin]][j]==rez)
++many;
}
}
}
int main()
{
f>>n>>m>>k;
for(i=1;i<=n;++i)
for(j=1;j<=m;++j)
f>>a[i][j];
while(k--)
{
f>>dx>>dy;
rez=8005;many=0;
calc(dx,dy);
if(dx-dy)
calc(dy,dx);
g<<rez<<" "<<many<<"\n";
}
}