Pagini recente » Cod sursa (job #2218229) | Cod sursa (job #2718926) | Cod sursa (job #1475822) | Cod sursa (job #2927626) | Cod sursa (job #2231770)
#include<cstdio>
#include<fstream>
#include<deque>
using namespace std;
FILE *f=fopen("struti.in","r");
ofstream g("struti.out");
int n,m,a[1002][1002],b[1002][1002],minim[1002][1002],maxim[1002][1002];
deque<int>dq;
void cmin(int x,int y)
{
int i,j;
for(i=1;i<=n;i++)
{
for(j=1;j<=m;j++)
{
while(!dq.empty()&&a[i][j]<=a[i][dq.back()])
dq.pop_back();
dq.push_back(j);
if(dq.back()-dq.front()>=y)
dq.pop_front();
if(j>=y)
b[i][j-y+1]=a[i][dq.front()];
}
dq.clear();
}
dq.clear();
for(j=1;j<=m-y+1;j++)
{
for(i=1;i<=n;i++)
{
while(!dq.empty()&&b[i][j]<=b[dq.back()][j])
dq.pop_back();
dq.push_back(i);
if(dq.back()-dq.front()>=x)
dq.pop_front();
if(i>=x)
minim[i-x+1][j]=b[dq.front()][j];
}
dq.clear();
}
dq.clear();
}
void cmax(int x,int y)
{
int i,j;
for(i=1;i<=n;i++)
{
for(j=1;j<=m;j++)
{
while(!dq.empty()&&a[i][j]>=a[i][dq.back()])
dq.pop_back();
dq.push_back(j);
if(dq.back()-dq.front()>=y)
dq.pop_front();
if(j>=y)
b[i][j-y+1]=a[i][dq.front()];
}
dq.clear();
}
dq.clear();
for(j=1;j<=m-y+1;j++)
{
for(i=1;i<=n;i++)
{
while(!dq.empty()&&b[i][j]>=b[dq.back()][j])
dq.pop_back();
dq.push_back(i);
if(dq.back()-dq.front()>=x)
dq.pop_front();
if(i>=x)
maxim[i-x+1][j]=b[dq.front()][j];
}
dq.clear();
}
dq.clear();
}
int main()
{
int p,i,j,x,y,sol,k,l;
fscanf(f,"%d%d%d",&n,&m,&p);
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
fscanf(f,"%d",&a[i][j]);
for(l=1;l<=p;l++)
{
fscanf(f,"%d%d",&x,&y);
cmin(x,y);
cmax(x,y);
sol=1000000;
k=0;
for(i=1;i<=n-x+1;i++)
for(j=1;j<=m-y+1;j++)
{
if(maxim[i][j]-minim[i][j]<sol)
sol=maxim[i][j]-minim[i][j],k=1;
else
if(maxim[i][j]-minim[i][j]==sol)
k++;
}
if(x!=y)
{
cmin(y,x);
cmax(y,x);
for(i=1;i<=n-y+1;i++)
for(j=1;j<=m-x+1;j++)
{
if(maxim[i][j]-minim[i][j]<sol)
sol=maxim[i][j]-minim[i][j],k=1;
else
if(maxim[i][j]-minim[i][j]==sol)
k++;
}
}
g<<sol<<" "<<k<<'\n';
}
return 0;
}