Pagini recente » Cod sursa (job #1725406) | Cod sursa (job #2514085) | Cod sursa (job #420923) | Cod sursa (job #42831) | Cod sursa (job #2055458)
#include <fstream>
#include <algorithm>
using namespace std;
ifstream in ("struti.in");
ofstream out ("struti.out");
const int N=1002;
int n,m;
int a[N][N],st1[N],st2[N],dr2[N],dr1[N],d1[N][N],d2[N][N],dmin[N],dmax[N],deq1[N],deq2[N];
int struti(int dx,int dy,int &mini,int &ap)
{
mini=2000000000, ap=0;
int i,j,stmin,drmin,stmax,drmax;
for (i=1;i<=m;i++)
st1[i]=st2[i]=1, dr1[i]=dr2[i]=0;
for (i=1;i<=n;i++)
{
for (j=1;j<=m;j++)
{
while (st1[j]<=dr1[j] && a[d1[j][dr1[j]]][j]>=a[i][j])
dr1[j]--;
dr1[j]++;
d1[j][dr1[j]]=i;
if (st1[j]<=dr1[j] && d1[j][st1[j]]==i-dx)
st1[j]++;
if (i>=dx)
dmin[j]=a[d1[j][st1[j]]][j];
}
for (j=1;j<=m;j++)
{
while (st2[j]<=dr2[j] && a[d2[j][dr2[j]]][j]<=a[i][j])
dr2[j]--;
dr2[j]++;
d2[j][dr2[j]]=i;
if (st2[j]<=dr2[j] && d2[j][st2[j]]==i-dx)
st2[j]++;
if (i>=dx)
dmax[j]=a[d2[j][st2[j]]][j];
}
if (i>=dx)
{
stmin=stmax=1;
drmin=drmax=0;
int k;
for (k=1;k<=m;k++)
{
while (stmin<=drmin && dmin[deq1[drmin]]>=dmin[k])
drmin--;
drmin++;
deq1[drmin]=k;
while (stmin<=drmin && deq1[stmin]==k-dy)
stmin++;
while (stmax<=drmax && dmax[deq2[drmax]]<=dmax[k])
drmax--;
drmax++;
deq2[drmax]=k;
while (stmax<=drmax && deq2[stmax]==k-dy)
stmax++;
if (k>=dy && stmax<=drmax && stmin<=drmin)
{
if (mini>abs(dmax[deq2[stmax]]-dmin[deq1[stmin]]))
mini=abs(dmax[deq2[stmax]]-dmin[deq1[stmin]]), ap=1;
else
if (mini==abs(dmax[deq2[stmax]]-dmin[deq1[stmin]]))
ap++;
}
}
}
}
}
int main()
{
int i,j,dx,dy,q,mini1,mini2,ap1,ap2;
in>>n>>m>>q;
for (i=1;i<=n;i++)
for (j=1;j<=m;j++)
in>>a[i][j];
for (i=1;i<=q;i++)
{
in>>dx>>dy;
ap1=ap2=0;
if (dx==dy)
{
struti(dx,dy,mini1,ap1);
out<<mini1<<" "<<ap1;
}
else
{
struti(dx,dy,mini1,ap1);
struti(dy,dx,mini2,ap2);
if (mini1>mini2)
out<<mini2<<" "<<ap2<<"\n";
else
if (mini1==mini2)
out<<mini1<<" "<<ap1+ap2<<"\n";
else
out<<mini1<<" "<<ap1<<"\n";
}
}
return 0;
}