Pagini recente » Monitorul de evaluare | Cod sursa (job #2014984) | Ceva interesant de văzut?:) | infoabc_9 | Cod sursa (job #2059056)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("struti.in");
ofstream fout("struti.out");
int n,m,a[101][101],mn[101][101],mx[101][101];
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,maxim=100000;
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) maxim = min(maxim,mx[i][dmax[stmax]]-mn[i][dmin[stmin]]);
}
}
return maxim;
}
int main()
{
int i,j,x,y,p,rez=100000;
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;
dqv(x);
rez=min(rez,dqo(x,y));
dqv(y);
rez=min(rez,dqo(x,y));
fout<<rez<<endl;
}
return 0;
}