Pagini recente » Cod sursa (job #1130433) | Cod sursa (job #1663244) | Cod sursa (job #588853) | Cod sursa (job #122646) | Cod sursa (job #2059197)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("struti.in");
ofstream fout("struti.out");
int n,m,a[1001][1001],mn[1001][1001],mx[1001][1001],ap;
int dmax[1000001],dmin[10000001];
void dqv(int x)
{
int i,j,h,MX;
for(j=1; j<=m; j++)
{
int drmax=-1,stmax=0,drmin=-1,stmin=0;
for(i=1; i<=n; i++)
{
if(stmax<=drmax && dmax[stmax]==i-x) stmax++;
while(stmax<=drmax&&a[i][j]>=a[dmax[drmax]][j])drmax--;
dmax[++drmax]=i;
mx[i][j]=a[dmax[stmax]][j];
}
for(i=1; i<=n; i++)
{
if(stmin<=drmin && dmin[stmin]==i-x) stmin++;
while(stmin<=drmin&&a[i][j]<=a[dmin[drmin]][j])drmin--;
dmin[++drmin]=i;
mn[i][j]=a[dmin[stmin]][j];
}
}
}
int dqo(int x, int y)
{
int i,j,minim=100000;
dqv(x);
for(int i=x;i<=n;i++)
{
int drmax=-1,stmax=0,drmin=-1,stmin=0;
for(j=1;j<=m;j++)
{
if(stmax<=drmax && dmax[stmax] == j-y) stmax++;
if(stmin<=drmin && dmin[stmin] == j-y) stmin++;
while(stmax<=drmax && mx[i][j] >= mx[i][dmax[drmax]]) drmax--;
while(stmin<=drmin && mn[i][j] <= mn[i][dmin[drmin]]) drmin--;
dmax[++drmax]=j;
dmin[++drmin]=j;
if (j >= y)
{
if(minim>mx[i][dmax[stmax]]-mn[i][dmin[stmin]])
{
minim=mx[i][dmax[stmax]]-mn[i][dmin[stmin]];ap=1;
}
else if(minim==mx[i][dmax[stmax]]-mn[i][dmin[stmin]])ap++;
}
}
}
if(x!=y)
{
dqv(y);
for(int i=y;i<=n;i++)
{
int drmax=-1,stmax=0,drmin=-1,stmin=0;
for(j=1;j<=m;j++)
{
if(stmax<=drmax && dmax[stmax] == j-x) stmax++;
if(stmin<=drmin && dmin[stmin] == j-x) stmin++;
while(stmax<=drmax && mx[i][j] >= mx[i][dmax[drmax]]) drmax--;
while(stmin<=drmin && mn[i][j] <= mn[i][dmin[drmin]]) drmin--;
dmax[++drmax]=j;
dmin[++drmin]=j;
if (j >= x)
{
if(minim>mx[i][dmax[stmax]]-mn[i][dmin[stmin]])
{
minim=mx[i][dmax[stmax]]-mn[i][dmin[stmin]];ap=1;
}
else if(minim==mx[i][dmax[stmax]]-mn[i][dmin[stmin]])ap++;
}
}
}
}
return minim;
}
int main()
{
int i,j,x,y,p,rez=100000,ap1,ap2,rez1;
fin>>n>>m>>p;
for(i=1; i<=n; i++)
{
for(j=1; j<=m; j++)
{
fin>>a[i][j];
}
}
for(i=1; i<=p; i++)
{
fin>>x>>y;
ap=1;
rez=dqo(x,y);
fout<<rez<<" "<<ap<<'\n';
}
return 0;
}