Pagini recente » Cod sursa (job #2643706) | Cod sursa (job #901073) | Cod sursa (job #1457854) | Cod sursa (job #862100) | Cod sursa (job #2530951)
#include <bits/stdc++.h>
using namespace std;
int n,p,m,x,y,ans,nr;
int v[1009][1009],nrm[1009][1009],nrM[1009][1009],ansmin[1009][1009],ansmax[1009][1009],deq[1009],deqM[1009];
void deqlinii(int a, int b)
{
int f1,f2,l1,l2;
for (int i=1; i<=n; ++i)
{
f1=f2=1;
l1=l2=0;
for (int j=1; j<=m; ++j)
{
while (l1>=f1 && v[i][j]<v[i][deq[l1]])
{
l1--;
}
deq[++l1]=j;
if (j-deq[f1]>=b)
{
f1++;
}
nrm[i][j]=v[i][deq[f1]];
while (l2>=f2 && v[i][j]>v[i][deqM[l2]])
{
l2--;
}
deqM[++l2]=j;
if (j-deqM[f2]>=b)
{
f2++;
}
nrM[i][j]=v[i][deqM[f2]];
}
}
}
void deqcoloane(int a, int b)
{
int f1,f2,l1,l2;
for (int j=b; j<=m; ++j)
{
f1=f2=1;
l1=l2=0;
for (int i=1; i<=n; ++i)
{
while (l1>=f1 && nrm[i][j]<nrm[deq[l1]][j])
{
l1--;
}
deq[++l1]=i;
if (i-deq[f1]>=a)
{
f1++;
}
ansmin[i][j]=nrm[deq[f1]][j];
while (l2>=f2 && nrM[i][j]>nrM[deqM[l2]][j])
{
l2--;
}
deqM[++l2]=i;
if (i-deqM[f2]>=a)
{
f2++;
}
ansmax[i][j]=nrM[deqM[f2]][j];
}
for (int i=a; i<=n; ++i)
{
if (ansmax[i][j]-ansmin[i][j]<ans)
{
ans=ansmax[i][j]-ansmin[i][j];
nr=1;
}
else
{
if (ansmax[i][j]-ansmin[i][j]==ans)
{
nr++;
}
}
}
}
}
void solve(int a, int b)
{
deqlinii(a,b);
deqcoloane(a,b);
}
int main()
{
ifstream fin("struti.in");
ofstream fout("struti.out");
fin>>n>>m>>p;
for (int i=1; i<=n; ++i)
{
for (int j=1; j<=m; ++j)
{
fin>>v[i][j];
}
}
while (p--)
{
fin>>x>>y;
ans=1e9;
nr=0;
solve(x,y);
if (x!=y)
{
solve(y,x);
}
fout<<ans<<" "<<nr<<"\n";
}
}